利用位运算判断数组中是否有重复的数字
来源:互联网 发布:mill9%2e1编程教程 编辑:程序博客网 时间:2024/06/11 21:54
讨论这个主题的来由是《剑指offer》上的一道题目:
解题思路:
只要满足条件
1)数组的长度为5;
2)数组中的最大值减去最小值小于5(最大值、最小值不取0);
3)除0外没有重复的数字。
这个数组就是连续的,即可组成顺子。
代码如下:
class Solution {public: bool IsContinuous( vector<int> numbers ) { if(numbers.size() != 5) return false; int min = 14; // 设定最小值的初始值 int max = -1; // 设定最大值的初始值 int flag = 0; // flag用于判定数组中是否有重复值 for(int i = 0; i < 5; i++){ // 根据题意,数字的范围为1-13,若不在此范围则返回false if(numbers[i] < 0 || numbers[i] > 13) return false; if(numbers[i] == 0) continue; // 判断数字是否重复 if(((1 << numbers[i]) & flag) > 0) return false; flag |= (1 << numbers[i]); if(numbers[i] > max) max = numbers[i]; if(numbers[i] < min) min = numbers[i]; // 判断最大值与最小值的差是否小于5 if(max - min > 4) return false; } return true; }};
我们用到了位运算来判断数组中是否存在重复值,它的原理简单且实用:
因为我们的数字范围为1-13,用每一个bit对应一个数字,如果出现过,那么flag上这个bit就为1,不然就是0,且用一个32bit的int型足够容纳下所有位。
再回过头来看代码:
// 将1右移numbers[i]位,然后与flag进行按位与运算// 若flag上的第numbers[i]已为1,说明该位已被占用,数字重复了,运算的结果大于0,返回falseif(((1 << numbers[i]) & flag) > 0) return false;// 通过“或操作”填充flag中不同的二进制位flag |= (1 << numbers[i]);
0 0
- 利用位运算判断数组中是否有重复的数字
- 判断数组中是否有重复数字(two ways +位运算)
- 判断数组中是否有重复的数字
- 判断数组中是否有重复的数字(C++)
- 数组中是否有重复的数字
- 判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
- (六)一个判断整形数组中是否有重复数字的简单算法
- JS判断一个数组(包括字符串数组和数字数组)中是否有重复值的三种方法 .
- 判断数组中是否包含重复数字
- 判断数组中是否包含重复数字
- Js数组中判断是否有重复
- 判断数组中,是否有重复的选项。
- 判断一个数组中是否有重复的元素
- js判断一个数组中是否有重复的值
- JavaScript 判断两个数组是否相等 或者 判断一个数组中是否有重复的元素
- 判断两个数组中是否有相同的数字
- 判断两个有序数组中是否有相同的数字
- C语言--判断输入的整数中数字是否有重复
- 【九度OJ】题目1194:八进制 解题报告
- 团体程序设计天梯赛-练习集 L3-007. 天梯地图 最短路 dijkstra 解题报告
- json在python中的处理
- 客户端存储
- Markdown——入门指南
- 利用位运算判断数组中是否有重复的数字
- 2.10.PHP7.1 女神级教程-女神的私人信息 -【PHP 函数】
- 最短路径 还原路径(dijkstra算法)
- PHP->文件的操作
- C#学习一:编一个可以画线的小程序
- java、freemarker保留两位小数
- java学习笔记-03
- 贝叶斯决策思想的应用与延伸
- leetcode:459. Repeated Substring Pattern