解题思路:
2个相同的2进制数做不进位加法,结果为0
10相同的10进制数做不进位加法,结果为0
K个相同的K进制数做不进位加法,结果为0
任意进制互换方法:
1、手工取余法
2、Integer.toString(i,radix)
1 package bitOperation; 2 3 /** 4 * @author zsh 5 * @company wlgzs 6 * @create 2019-02-15 8:37 7 * @Describe 题7·出现K次与出现1次 8 * 数组中只有一个数出现了1次,其他的数都出现K次, 9 * 请输出出现1次的数。 10 */ 11 public class Main7 { 12 public static void main(String[] args) { 13 int[] arr = {1,1,1,2,2,2,3,4,4,4,5,5,5}; 14 int len = arr.length; 15 char[][] kRadix = new char[len][]; 16 int k = 3; 17 18 int maxlen = 0; 19 //转成K进制字符数组 20 for (int i = 0; i < len; i++) { 21 //求每个数字的3进制字符串并翻转,然后转为字符数组 22 kRadix[i] = new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray(); 23 if (kRadix[i].length > maxlen){ 24 maxlen = kRadix[i].length; 25 } 26 } 27 28 int[] resArr = new int[maxlen]; 29 for (int i = 0; i < len; i++) { 30 //不进位加法 31 for (int j = 0;j<maxlen;j++){ 32 if (j >= kRadix[i].length) 33 resArr[j] += 0; 34 else 35 resArr[j] += (kRadix[i][j] - '0'); 36 } 37 } 38 39 int res = 0; 40 //将K进制数还原为10进制数 41 for (int i = 0; i < maxlen; i++) { 42 res += (resArr[i] % k) * (int) Math.pow(k,i); 43 } 44 System.out.println(res); 45 } 46 }