LeetCode-693. 交替位二进制数
2023-09-14 09:01:27 时间
题目描述:
给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。
解题思路一:先把n转为2进制数(有一个模板可以看看解题思路三)若有相邻的两位相等的话,可以直接返回false,否则返回true;
class Solution {
public:
string binaryNum(int n){//n=5;
string s;
string s1="01";
while(n>0){
int x=n%2;
s=s1[x]+s;//一:1+"" 二:0+"1" 三:1+"01"
n/=2;
}
return s;
}
bool hasAlternatingBits(int n) {
string s=binaryNum(n);
int i=1;
int m=s.size();
if(n<=1){
return true;
}else{
while(s[i]!='\0'){
if(s[i]!=s[i-1]) ++i;
else return false;
}
}
return true;
}
};
解题思路二:两行代码流???//判断括号尽量别省略
C++中^运算是求异或的:同0异1
若n中二进制每位均不同,则n与n右移一位异或得全1;如:5
原来的n:101
右移的n1:010
结果的n2:111
得到n2后,n2加1便得1000,他俩且运算便得全0;
否则n不满足条件;
bool hasAlternatingBits(int n) {
n = (n ^ (n >> 1));
return (n & ((long)n + 1)) == 0;
}
解题思路三:十进制数转为其他进制数如m进制
每次取最低位,求余是为了得到最低位的数
除是为了右移一位,因为上面已经得到了最低一位数
string binaryNum(int n){//n=5;
string s;
string s1="0123456789abcdef";
while(n>0){
int x=n%m;
s=s1[x]+s;//一:1+"" 二:0+"1" 三:1+"01"
n/=2;
}
return s;
}
相关文章
- Java实现 LeetCode 762 二进制表示中质数个计算置位(位运算+JDK的方法)
- Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
- Java实现 LeetCode 693 交替位二进制数(位运算)
- Java实现 LeetCode 693 交替位二进制数(位运算)
- Java实现 LeetCode 653 两数之和 IV - 输入 BST(递归,找差值)
- Java实现 LeetCode 401 二进制手表
- Java实现 LeetCode 401 二进制手表
- Java实现 LeetCode 319 灯泡开关
- 【链表】LeetCode 148. 排序链表【中等】
- LeetCode(85):最大矩形
- Leetcode.面试题 05.02 二进制数转字符串
- LeetCode-67. 二进制求和【位运算,字符串,数学,模拟】
- LeetCode-1758. 生成交替二进制字符串的最少操作数【字符串,三行代码!】
- LeetCode-762. 二进制表示中质数个计算置位【二进制,质数,判断质数优化】
- 【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】
- Leetcode 2261. 含最多 K 个可整除元素的子数组(暴力枚举,尽力了)
- Leetcode 1290. 二进制链表转整数
- Leetcode 728. 自除数
- 力扣LeetCode,两个数组的交集
- 【Leetcode刷题Python】25.K 个一组翻转链表
- 【Leetcode刷题Python】367. 有效的完全平方数
- LeetCode 102. 二叉树的层序遍历