奇偶数合并

今天分享一道很有意思的算法题目

1、题目描述

奇偶数合并

将所有相邻且相同的偶数相加放入相邻偶数中间 将所有相邻且相同奇数相加,替换掉这两个相邻且相同的奇数 最后输出合并后的数组结果。

举例

数组[1,2,2,7,8,3,3,6]

数组奇偶数合并之后[1,2,4,2,7,8,6,12,6]

2、思路

由于要对偶数合并且将合并值增加到相邻且相等2个偶数之间,然后相邻且相等奇数合并,原始数组长度可能会发生改变,因此需要用额外的数据结构进行存储临时计算结果数据。这里用List进行存储,也可以用其它数据结果存储。

另外两个奇数相加等于偶数,因此要先计算偶数,再计算奇数。

第一轮计算之后,需要判断是否还需要递归进行计算,如果需要,则递归奇偶数合并即可,最后输出计算结果。

3、实战

public class Test1 {

    public static void main(String[] args) {
        int[] array = {1,2,2,7,8,3,3,6};
        calculatedNum(array);
    }

    /**
     * 奇偶数合并
     * 将所有相邻且相同的偶数相加放入相邻偶数中间
     * 将所有相邻且相同奇数相加,替换掉这两个相邻且相同的奇数
     * 最后输出合并后的数组结果
     *
     * @param array 待排序数组
     * @return int[] 结果
     */
    public static int[] calculatedNum(int[] array){
        if(array.length == 0){
            return new int[0];
        }

        List lists = new ArrayList<>();
        for (int i = 0; i < array.length-1; i++) {
            if(array[i]==array[i+1]){
                if(array[i]%2==0){
                    lists.add(array[i]);
                    lists.add(array[i]*2);
                }else{
                    lists.add(array[i]*2);
                    i++;
                }
            }else{
                lists.add(array[i]);
            }
        }
        // 由于上面for循环结束条件是i < array.length-1,这里需要添加最后一个元素,才能遍历完全
        lists.add(array[array.length-1]);
        // 将list转成array
        int[] list2Array = Arrays.stream(lists.toArray()).mapToInt(x -> (int) x).toArray();
        if(isNeedRepeatCalculated(list2Array)){
           return  calculatedNum(list2Array);
        }
        return list2Array;
    }

    /**
     * 判断是否需要二次合并计算
     *
     * @param array 待判断的数组
     * @return boolean 结果
     */
    public static boolean isNeedRepeatCalculated(int[] array){
        for (int i = 0; i < array.length-1; i++) {
            if(array[i] == array[i+1]){
                return true;
            }
        }
        return false;
    }
}

你可能感兴趣的:(力扣算法冲刺,算法,数据结构,java)