Leetcode LCR 178. 训练计划 VI

文章讲述了在一个教练和学员训练过程中,通过观察教练和学员的动作编号数组,找出教练编号的独特算法。关键在于利用每位数字的1的总数是否能被3整除来确定唯一出现一次的数字,从而找到教练的编号。
摘要由CSDN通过智能技术生成

题目描述

教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions,其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。

示例 1:

输入:actions = [5, 7, 5, 5]
输出:7

示例 2:

输入:actions = [12, 1, 6, 12, 6, 12, 6]
输出:1

提示:

  • 1 <= actions.length <= 10000
  • 1 <= actions[i] < 2^31

 NOTE:某一个数字出现3次,那么他们的每一位的和分别可以被3整除。

示例: 

数组=[2,2,3,2,6,3,3] 

在这个数组中,每个数字除了数字6之外都出现了三次,而数字6只出现了一次。我们的目标是找到这个只出现一次的数字6。

  • 第0位:2(010), 2(010), 3(011), 2(010), 6(110), 3(011), 3(011)
    • 1的总数:2 + 2 + 1 + 2 + 0 + 1 + 1 = 9(可以被3整除,结果0)
  • 第1位
    • 1的总数:1 + 1 + 1 + 1 + 1 + 1 + 1 = 7(不能被3整除,结果2^1)
  • 第2位
    • 1的总数:0 + 0 + 0 + 0 + 1 + 0 + 0 = 1(不能被3整除,结果2^2)

 

最终,第1位和第2位上的1的总数不能被3整除,说明这两位在只出现一次的数字中是1。因此,最终结果为:

21+22=2+4=621+22=2+4=6

这样,我们就找到了数组中唯一出现一次的数字6

完整代码:

class Solution {
public:
    int trainingPlan(vector<int>& actions) {
        int result = 0;  // result 用来存储最终的结果,初始化为0。
        int size = actions.size();  // 获取数组的长度,避免多次调用size()方法。
        
        // 循环遍历每一个位(整数由32位组成)
        for(int i = 0; i < 32; i++) {
            int temp = 0;  // 临时变量temp用于计算所有数字在第i位上的1的总和。
            
            // 遍历数组中的每个元素,累加第i位的值
            for(int j = 0; j < size; j++) {
                temp += (actions[j] >> i) & 1;  // 将第j个元素右移i位后与1进行AND操作,得到第i位的值,并累加到temp。
            }
            
            // 如果第i位上1的总数不能被3整除,说明单独出现一次的数字在这一位上是1
            if(temp % 3) {
                result += 1 << i;  // 通过左移操作将1移动到第i位,然后加到result中。
            }
        }
        return result;  // 返回找到的那个唯一不是出现三次的数字。
    }
};

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值