2021/4/30 数组中只出现一次的数(其它数出现k次)

数组中只出现一次的数(其它数出现k次)

https://www.nowcoder.com/practice/5d3d74c3bf7f4e368e03096bb8857871

题目描述

给定一个整型数组 arr 和一个整数 k(k>1)。
已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。
请返回只出现了 1 次的数。

示例

输入

[5,4,1,1,5,1,5],3
输出
4

解题思路

  1. 将所有数字的二进制对应位置进行求和,用过 Excel 的胖友应该都知道求和操作,如图
    图片说明
    我们假设有四个数字,其中有三个重复的 2,和一个单独的 3;
  2. 因为有 3 个数是重复的,所有把所有二进制位求和之后得到的数值进行取模操作,如图
    图片说明
    于是就得到了结果。

Java代码实现

public int foundOnceNumber (int[] arr, int k) {
        int[] count = new int[32];    // Java 中,int 有 32 位
        for (int i = 0; i < arr.length; ++i) {    // 将所有数的对应二进制位进行求和
            for (int j = 0; j < 32; ++j) {
                count[j] += arr[i] & 1;
                arr[i] >>>= 1;
            }
        }

        int res = 0;
        for (int i = 0; i < 32; ++i) {    // 求和之后再取出来,同时要取模操作
            res <<= 1;
            res |= count[31 - i] % k;    // 有 k 个相同的 1, 则 k % k == 0,剩下的就是多出来的那个数
        }


        return res;
    }
全部评论

相关推荐

03-26 13:04
已编辑
电子科技大学 算法工程师
xiaowl:你这个简历“条目上”都比较有深度性,但是实际上面试官又没法很好的评估你是怎么达到很多看上去很厉害的结果的。要避免一些看上去很厉害的包装,比如高效的内存复用策略的表达,如果仅是简单的一些内存共享机制,而且面试上也没有深挖的空间,就不要这样表达。比如,工程化模式本质上可能就是定义了一些abstract class,那也就没特别多值得讲的内容。建议简历上应该侧重那些你花了大量时间和精力解决、研究的问题,不要过分追求“丰富”,而是关注在技术深入度、问题解决能力的表现上。
没有实习经历,还有机会进...
点赞 评论 收藏
分享
牛客100866号技...:把电科加粗,把电科加粗,把电科加粗,两个吊车尾的项目合并成一个,再加一个管理系统。电科✌🏻在成都面中厂手拿把掐
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务