通用逻辑可就地减去数组元素

问题描述

我有一个输入字符串"abcdefgh",它可以是任何长度为N的字符串,但是它符合某些条件

条件:

1.N始终是给定字符串的倍数。

2。对于给定的整数K,字符串遵循重复模式直到N。 例如:abcdefghi N = 9 K = 3(N的倍数)

采用前3个子字符串i,即abc

因此abcdefghi应该变成abcabcabc (遵循重复模式直到其长度N)

成本计算

abc-->abc-- 0+0+0
def-->abc-- 3+3+3
ghi-->abc-- 6+6+6

总费用= 0 + 0 + 0 + 3 + 3 + 3 + 6 + 6 + 6 = 27

一个子字符串def

abcdefghi--->defdefdef

成本计算

abc-->def--3+3+3
def-->def--0+0+0
ghi-->def--3+3+3

总费用= 3 + 3 + 3 + 0 + 0 + 0 + 3 + 3 + 3 = 18

类似地,k = 3的最后一个子字符串为ghi

这将得出结果27

所以我们有27,18,27

最低费用为18

我建议的解决方案:

我写了一个java类,按照以下步骤操作:

第1步:将String转换为char数组。

String input = "abcdefghi";
char arr[] = input.tochararray();

步骤2:将char数组转换为各自的ASCII

int ascii[] = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            ascii[i] = (int) arr[i];
        } 

所以abcdefghi我有97,98,99,100,101,102,103,104,105

然后将其传递给下面的方法minCost

public static int minCost(int[] arr,int k,int size) {
        int totalCount = 0;
        int n = 0;
        int sub_arr[] = new int[size];

        int finalArr[] = new int[arr.length];
        for (int i = currentPos; i < k; i++) {
            sub_arr[n++] = arr[i];
            currentPos++;
        }
        int pos1 = 0;
        int pos2 = 0;
        int pos3 = 0;
        while (pos1 < sub_arr.length) {
            int elem = arr[pos1] - sub_arr[pos1];
            finalArr[pos1] = elem>=0?elem:checkForNegativeNumber(elem);
            pos1++;
        }
        while (pos2 < sub_arr.length) {
            int elem = arr[pos1] - sub_arr[pos2];
            finalArr[pos1] = elem>=0?elem:checkForNegativeNumber(elem);
            pos1++;
            pos2++;
        }
        while (pos3 < sub_arr.length) {
            int elem = arr[pos1] - sub_arr[pos3];
            finalArr[pos1] = elem>=0?elem:checkForNegativeNumber(elem);
            pos1++;
            pos3++;
        }

        for (int idx = 0; idx < finalArr.length; idx++) {
            totalCount = totalCount + finalArr[idx];
        }
        minCostCountList.add(totalCount);
        if (currentPos < arr.length) {
            int next = (k + currentPos) <= arr.length ? (k + currentPos) : arr.length;
            minCost(arr,next,size);
        }
        currentPos=0;
        return Collections.min(minCostCountList);
    }

工作

首先将创建长度为k的子数组,使用该数组我们将从原始数组中减去元素,这将导致三个while循环。

对于第一次迭代,sub_arr的ASCII码为abc,即97、98、99。

第二次迭代,sub_arr的定义为i,即100,102。

第三次迭代,sub_arr具有ghi i的ascii,即103,105。

首先whilearr中减去0到3个元素,并将结果存储到finalArr

第二whilearr中减去3到6个元素,并将结果存储到finalArr

第三while从arr中减去6到9个元素,并将结果存储到finalArr

对于k = 3,我会跟踪currentPos静态变量中的位置,并递归调用minCost直到不涵盖整个length

问题

代码块的问题是三个while循环,实际上,它对于长度为9且K = 3的字符串正常工作,对于KN的不同值,代码会中断。 / p>

假设对于*S="abcdefgh"*,如果k = 2,那么对于每一对,我需要4个while循环,这是很糟糕的方法,如果我有s="abcdefghijklmnopqr" k = 3,那么在这种情况下我需要3 * 9 = 27 while循环。

我如何摆脱这种情况,实际上,我正在寻找一种精炼实现,以通过使用可以对K和N的不同值起作用的通用逻辑就地减去数组元素

请推荐并帮助我

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)