微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决通用逻辑可就地减去数组元素

我有一个输入字符串"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 举报,一经查实,本站将立刻删除。