今天分享一道很有意思的算法题目
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<Integer> 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转成arrayint[] 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;}
}