思路: 两个二进制数相加 如: 101 +11 = 1000
private static final int[] a = { 1, 0, 1 };
private static final int[] b = { 1, 1 };
答案应该是:1000
分析:如果按照正常的加法,我们得从数组的末尾开始计算,但是这样会使数组的索引处理出现问题,稍微有些复杂,所以我想把数组先倒叙,再把数组相加,相加后再倒叙回来,这样问题会简单许多。
下面仅仅提供一个思路:
<pre name="code" class="java"> private static int[] Add(int[] a2, int[] b2) {
int minLen = 0;
int maxLen = 0;
int[] maxArr = null;
int[] minArr = null;
if (a2.length > b2.length) {
minLen = b2.length;
maxLen = a2.length;
maxArr = a2;
minArr = b2;
} else {
maxLen = b2.length;
minLen = a2.length;
maxArr = b2;
minArr = a2;
}
int[] newArr = new int[maxLen + 1];
/**
* 先把数组倒叙
*/
maxArr = revArr(maxArr);
printArr(maxArr);
minArr = revArr(minArr);
printArr(minArr);
// 是否有进制
boolean isCanUp = false;
for (int i = 0; i < maxLen + 1; i++) {
if (i < minLen) {
if (isCanUp) {
if (maxArr[i] + minArr[i] + 1 >= 2) {
newArr[i] = (maxArr[i] + minArr[i] + 1) % 2;
isCanUp = true;
} else {
newArr[i] = maxArr[i] + minArr[i];
isCanUp = false;
}
} else {
if (maxArr[i] + minArr[i] >= 2) {
newArr[i] = (maxArr[i] + minArr[i]) % 2;
isCanUp = true;
} else {
newArr[i] = maxArr[i] + minArr[i];
isCanUp = false;
}
}
} else if (i < maxLen) {
if (isCanUp) {
if (maxArr[i] + 1 >= 2) {
newArr[i] = (maxArr[i] + 1) % 2;
isCanUp = true;
} else {
newArr[i] = maxArr[i] + 1;
isCanUp = false;
}
} else {
newArr[i] = maxArr[i];
isCanUp = false;
}
} else {
if (isCanUp) {
newArr[i] = 1;
} else {
newArr[i] = 0;
}
}
}
printArr(newArr);
int[] arr = revArr(newArr);
printArr(arr);
return arr;
}
数据算法对于这种简单的算法技巧性要求比较高,正这来不行,就反过来。