繁体   English   中英

比较数组中的连续元素并求和相同的值

[英]Compare consecutive elements in array and sum same values

public class LoopTest {

    public static void main(String[] args) {

        int[] myarr = {12, 12, 12, 8, 15, 15};

        //Boolean array to mark the elements,defaults false 
        boolean[] b = new boolean[myarr.length];

        //Compare Consecutive values and mark them true if equal
        for (int i = 1; i < myarr.length; i++) {
            if (myarr[i - 1] == myarr[i]) {
                b[i - 1] = b[i] = true;
            }
        }
        int sum = 0;

        //Add all the values in myarr with indices marked as equal
        for (int i = 0; i < b.length; i++) {
            if (b[i]) {
                sum += myarr[i];
            }
        }

        System.out.println(sum);


    }
}

输出:

66

说明:

12 + 12 + 12 + 15 + 15

有没有更好/更干净的方法可以比较数组中的值并仅在相等时才添加值,而无需使用实用程序方法?

您可以保留重复项目的连续计数,并在运行结束时将它们添加到sum

int[] myarr = {12, 12, 12, 8, 15, 15};
// assumes > 0 length
int count = 1;
int sum = 0;
for (int i = 1; i < myarr.length; i++) {
    if (myarr[i] == myarr[i - 1]) {
        count++;
    } else {
        if (count > 1) {
            sum += count * myarr[i - 1];
        }
        count = 1;
    }
}
// handle if last elements are duplicates
if (count > 1) {
    sum += count * myarr[myarr.length - 1];
}
System.out.println(sum);

以下代码将起作用:

public class LoopTest {
    public static void main(String[] args) {
        int[] myarr = {12, 12, 12, 8, 15, 15};
        int sum = 0;
        int occ = 1;
        for (int i = 1; i < myarr.length; i++) {
            if (myarr[i - 1] == myarr[i]) {
                occ++;
            } else {
                if (occ > 1) {
                    sum += (occ * myarr[i - 1]);
                }
                occ = 1;
            }
            if (i == myarr.length - 1) {
                if (occ > 1) {
                    sum += (occ * myarr[i - 1]);
                }
            }
        }
        System.out.println(sum);
    }
}

您可以通过linear efficiency解决此linear efficiency 该程序更干净一点,可以在所有条件下工作,检查所有边缘情况 它会为您的问题给出66的正确答案。 它遍历数组,并检查每个元素是否连续(与上一个元素相同)。 如果是这样,它将元素的值加到总和上。 需要包括边缘情况以说明每个连续块的起始元素,这些起始元素也必须添加到总和中。

private static int consecutiveCompare(int[] array)
{
    int sum = 0;

    for (int i = 1; i < array.length; i++)
    {
        if (array[i] == array[i-1])
        {
            if (i == 1)
            {
                sum += array[i];
            }
            else if (array[i] != array[i-2])
            {
                sum += array[i];
            }
            sum += array[i];
        }
    }

    return sum;
}

尚未测试所有极端情况,这就是我的想法:

public class LoopTest {

    public static void main(String[] args) {

        int[] myarr = {1,1,1,2,2,3,3,4};

        //Boolean array to mark the elements,defaults false 
        boolean[] b = new boolean[myarr.length];

        //Last value tracker.
        int lastVal = myarr[0];
        //Count occurrences in a sequence.
        int cntr = 1;
        //Sum counter.
        int sum = 0;
        //Compare Consecutive values and mark them true if equal
        for (int i = 1; i < myarr.length; i++) {
            if (myarr[i] == lastVal) {
                cntr++;
                //If last sequence mathching.
                if (i == myarr.length-1) {
                     sum += lastVal * cntr;
                }
            } else {
                if (cntr > 1) {
                    sum += lastVal * cntr;
                    //Reset counter. 
                    cntr = 1;
                }
                lastVal = myarr[i];
            }
        }
        System.out.println(sum);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM