福田做棋牌网站建设多少钱,网站建设 用什么语言,delphi 2010 网站开发,php 除了做网站位运算咋这么老难
剑指 Offer 56 - I. 数组中数字出现的次数 借评论区大佬答案#xff1a;nums [1,2,10,4,1,4,3,3] a^a0a^0aa^b^ca^c^ba(-a)最低位为1的二进制#xff08;从又到左#xff09;所有的异或结果得到sum2^108flag-888可分为两组#xff0c;一组为与…位运算咋这么老难
剑指 Offer 56 - I. 数组中数字出现的次数 借评论区大佬答案nums [1,2,10,4,1,4,3,3] a^a0a^0aa^b^ca^c^ba(-a)最低位为1的二进制从又到左所有的异或结果得到sum2^108flag-888可分为两组一组为与flag相与等于1的[10]另一组为0的[1,2,4,1,4,3,3]组内异或分别得到【10】【2】public int[] singleNumbers(int[] nums) {int sum0;//得到异或结果即为不相同两个数的异或结果sumfor (int num : nums){sum ^ num;}// 得到sum的二进制1的最低位int flag (-sum)sum;int result[] new int[2];//分成两个组进行异或每组异或后的结果就是不相同两个数的其中之一for (int num : nums){if ((flagnum)0)result[0] ^ num;elseresult[1] ^ num;}return result;} 剑指 Offer 56 - II. 数组中数字出现的次数 II
思路不用位运算的话挺简单用位运算没啥思路
// 非位运算
public int singleNumber(int[] nums) {int result0;Arrays.sort(nums);int i0;while (inums.length-1){if (nums[i]!nums[i2]){result nums[i];break;}i 3;}result nums[i];return result;} 位运算思路如果一个数字出现3次它的二进制每一位也出现的3次。如果把所有的出现三次的数字的二进制表示的每一位都分别加起来那么每一位都能被3整除。 我们把数组中所有的数字的二进制表示的每一位都加起来。如果某一位能被3整除那么这一位对只出现一次的那个数的这一肯定为0。如果某一位不能被3整除那么只出现一次的那个数字的该位置一定为1. public int singleNumber(int[] nums) {int [] k new int[32];for(int i 0 ; i nums.length;i){for(int j 0 ; j 32;j){k[j] (nums[i]j 1) 1 ? 1 : 0;}}int res 0;for(int i 31;i0;i--){res res 1;if(k[i]%3 1){res (res | 1);}}return res;}