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

给定一个数组,里边成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);

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,459评论 0 2
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,843评论 0 89
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,364评论 0 9
  • 果然事情越多就越想安排的满一点,最后满到完不成,所以明天的任务量减少,来补今天的任务。数学不能太高估自己的...
    你本大王阅读 157评论 0 0
  • 最近突然觉得写点东西很容易,我计划写一千字的文章往往可以以两千字收尾。发表的一些小文章被越来越多的人认可,投稿给一...
    小女足以慰风尘阅读 225评论 0 1