1、通过动态规划可以将这个问题拆为求每个元素中奇数、偶数的个数
已经知道和运算有如下规律
奇数 + 奇数 = 偶数
偶数 + 偶数 = 偶数
奇数 + 偶数 = 奇数
2、所以我们可以用这个规律来进行运算
和为偶数选择个数:x、和为奇数选择个数:y
每个元素偶数个数:z、每个元素奇数个数:c
在第n个元素的时候
和为偶数个数:f(n) = x * z + y * c
和为奇数个数:f(n) = x * c + y * z
3、通过遍历数组得出结果 代码如下
public class Main {
public static int solution(String[] numbers) {
// 偶数组合选择个数 因为不可能不选择 所以初始为1
int evenWays = 1;
// 奇数组合选择个数
int oddWays = 0;
// 遍历数组
for (int i = 0; i < numbers.length; i++) {
// 将数组中每一个元素转为char数组
char[] num = numbers[i].toCharArray();
// 定义偶数个数奇数个数初始化
int oushu = 0;
int jishu = 0;
// 遍历字符数组计算偶数个数和奇数个数
for (int j = 0; j < num.length; j++) {
if (num[j] % 2 == 0) {
oushu++;
} else {
jishu++;
}
}
// 每遍历完一个元素之后 进行计算 注意需要用中间值避免影响下方算式
int evenWaysTemp = oushu * evenWays + jishu * oddWays;
int oddWaysTemp = oushu * oddWays + jishu * evenWays;
// 赋值偶数、奇数组合选择个数
evenWays = evenWaysTemp;
oddWays = oddWaysTemp;
}
// 生成所有可能的组合并检查和的奇偶性
return evenWays;
}
public static void main(String[] args) {
// 测试样例
System.out.println(solution(new String[]{"123", "456", "789"}));
System.out.println(solution(new String[]{"123456789"}));
System.out.println(solution(new String[]{"14329", "7568"}));
}
}