位运算题解,数组中只有一个数出现了一次,其他数字都出现了k次,请输出只出现一次的数字

mac2024-08-16  59

 

这个题不用位运算也可以解决。当然为了巩固位运算,我学习了这个。

首先需要了解一下不进位加法。

大体思路:

    

先将所有的数转换为k进制的数字,然后做不进位的加法,最后就剩下出现一次的k进制数,然后再将剩下的k进制数转换成十进制数

public class 出现k次 { public static void main(String[] args) { int[] arr={2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0}; int len = arr.length; char[][] KRadix = new char[len][]; //字符二维数组存取每一个数的三进制的每一位 int k =3; //记录转成k进制数的最长位数,用来看最后需要计算多少列 int maxLen = 0; //转成k进制数字 //对于每个数字 for(int i = 0;i<len;i++) { //求每个数字的三进制字符串并反转,然后转为字符数组 目的的将每个k进制数的低位对齐(因为转成k进制数的位数不同) KRadix[i] = new StringBuilder(Integer.toString(arr[i], k)).reverse().toString().toCharArray(); if(KRadix[i].length > maxLen) { maxLen = KRadix[i].length; } } //存放做完不进位加法每一位和 int[] resArr=new int[maxLen]; //做不进位加法 for(int i = 0;i<len;i++) { //不进位加法 for(int j = 0;j<maxLen;j++) { //如果j大于等于当前数组长度的话,就需要补0 if(j >=KRadix[i].length) { resArr[j]+=0; }else { resArr[j] += (KRadix[i][j]-'0'); } } } int res = 0; for(int i = 0;i<maxLen;i++) { res+=(resArr[i]%k)*(int)(Math.pow(k, i)); } System.out.println(res); } }

最新回复(0)