数组中只出现一次的两个数字②

博客围绕找出非空整数数组中只出现一次的元素展开,给出样例,如输入[2,2,3,2]输出3。分析采用位运算思路,将数组所有数字二进制每一位相加,若和能被三整除,只出现一次的数字该位为0,否则为1。

题目描述:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

样例:

输入: [2,2,3,2]
输出: 3
输入: [0,1,0,1,0,1,99]
输出: 99

分析:

继续沿用位运算的思路,如果一个数字出现了三次,那么它的每一位二进制表示也出现了三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被三整除。
因此我们把数组中的所有数字的二进制表示的每一位都分别加起来,如果和能被三整除,那么证明只出现一次的那个数字在这一位的表示是0,否则是1.

public int singleNumber3(int[] nums) {
        if(nums==null||nums.length==0)
        	return 0;
        int[] re=new int[32];
        for(int i=0;i<nums.length;i++) {
        	int k=1;
        	for(int j=31;j>=0;j--) {
        		//有0则0
        		if((nums[i]&k)!=0)
        			re[j]+=1;
        		k=k<<1;
        		//System.out.println(re[j]);
        	}
        }
        int n=0;
        for(int i=0;i<32;i++) {
        // 易出错的地方
        	n=n<<1;//每次先左移一位,留下最低位相加
        	n+=re[i]%3;
        }
        return n;
    }
### Java程序实现 以下是基于用户需求编写的Java程序,该程序会生成一个长度为10的随机数组元素范围为0至5)。随后,它将打印数组的内容并统计每个数字出现的次数。 ```java import java.util.Random; public class RandomArrayStats { public static void main(String[] args) { int[] array = new int[10]; Random random = new Random(); // 填充数组 for (int i = 0; i < array.length; i++) { array[i] = random.nextInt(6); // 生成0到5之间的随机整数 } // 输出原始数组 System.out.print("生成的数组: "); for (int num : array) { System.out.print(num + " "); } System.out.println(); // 换行 // 统计每个数字出现的次数 int[] counts = new int[6]; // 创建大小为6的数组存储各数字出现次数 for (int num : array) { counts[num]++; } // 输出统计结果 System.out.println("统计结果:"); for (int i = 0; i < counts.length; i++) { if (counts[i] > 0) { System.out.println(i + ": 出现了 " + counts[i] + " 次"); } } } } ``` #### 解析 此程序分为以下几个部分完成任务: 1. **初始化与填充数组**: 使用`Random`类生成0到5之间(含两端)的随机整数,并将其填入长度为10的数组中[^1]。 2. **输出数组内容**: 遍历数组并将其中的一个元素按顺序打印出来。 3. **统计出现次数**: 利用另一个辅助数组`counts`记录原数组中各个数值的频率。由于目标值域仅为0到5,因此可以安全创建固定大小为6的辅助数组来保存这些数据。 4. **展示统计数据**: 对于辅助数组中的每一项,如果其对应的计数值大于零,则打印该项及其出现次数。 通过这种方式,不仅满足了用户的初始请求——即生成特定规格的随机数组以及报告各项频次的功能,还提供了清晰易读的结果呈现形式。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值