奇妙的位运算

位运算之找到落单的数(完整版)

2019-01-22  本文已影响0人  掌灬纹

给定一个数组,里边成k(k!=1)对存在任意整数,

任意个,只有一个整数只存在一次,找到它并且输出之。

tip:不进位加法的理解,假设十个十进制数做不进位加法,则最终结果为零,

由此k个k进制数相加 在加 单独一个数,最终为那个单独的数,在由

k进制转为对应的十进制数即可。

样例数组 arr 及 进制 k:

int[] arr = {

    2,2,2,9,

    7,7,7,3,

    3,3,3,6,

    6,6,6,0,

    0,0 

};

int k = 3;

(Java 代码如下)

public static void main(String[] args) {

int[] arr = {2,2,2,9,

    7,7,7,3,

    3,3,3,6,

    6,6,6,0,

    0,0 

};

int k = 3;

int len = arr.length;

//字符二维数组 存储每一个数的k进制的每一位上的数

char[][] kRadix = new char[len][];

int maxlen = 0;//k进制最大占位,其他不够的都补0

//每个数字的k进制字符串 翻转(低位到高位),转为字符数组

for(int i = 0; i < len; i++) {

kRadix[i] = new StringBuilder

(Integer.toString(arr[i], k)).reverse().toString().toCharArray();

/**

* 字符二维数组的存储内容

* 2

* 2

* 2

* 001

* 12

* 12

* ...

*/

if(kRadix[i].length > maxlen) {

maxlen = kRadix[i].length;

}

}

//做不进位加法,每列正常求和,在对k取余

//每列字符相加,所以先遍历行

int[] resArr = new int[maxlen];

for(int i = 0; i < len; i++) {

for(int j = 0; j < maxlen; j++) {

if(j >= kRadix[i].length) {

resArr[j] += 0;

}else {

resArr[j] += kRadix[i][j] - '0';//转为int

}

}

}

int res = 0;

//每一列加和,对k 求余,并且转为10进制

//在把每一列相加,即为所求

for(int i = 0; i < resArr.length; i++) {

res += (resArr[i]%k) * (int)Math.pow(k, i);

}

System.out.println(res);

}

上一篇下一篇

猜你喜欢

热点阅读