大家好,我是刘天昊,这次给大家带来的是leetcode中位运算的操作集锦
那么一次放出三题,并且我会总结其中的位运算的操作
那么直接开始(推荐直接在leetcode上找题目,先做做看再看我的blog,要有自己思考的过程)
36. Valid Sudoku
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'
.
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
数独玩过的就知道,这题判断数独是否合法(不需要解数独)判断是否合法
那么我们可以开个hash表去判断行,列,九宫格内是否有重复的数字,这样当然ok
但是我们有更好的方案先po代码再讲解
bool isValidSudoku(char** board, int boardRowSize, int boardColSize)
{
int Sudoku=511;
for(int i=0;i0&&k<10)
{
if(Sudoku>>(k-1)&1==1)
{
Sudoku=Sudoku^(1<<(k-1));
}
else
{
return false;
}
}
}
}
for(int i=0;i0&&k<10)
{
if(Sudoku>>(k-1)&1==1)
{
Sudoku=Sudoku^(1<<(k-1));
}
else
{
return false;
}
}
}
}
int ptrRow=0;
int ptrCol=0;
while(ptrRow!=boardRowSize||ptrCol!=boardColSize)
{
Sudoku=511;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
int k=board[ptrRow+i][ptrCol+j]-48;
if(k>0&&k<10)
{
if(Sudoku>>(k-1)&1==1)
{
Sudoku=Sudoku^(1<<(k-1));
}
else
{
return false;
}
}
}
}
ptrRow+=3;
if(ptrRow==9&&ptrCol!=9)
{
ptrRow=0;
ptrCol+=3;
}
}
return true;
}
好,你咋一眼看代码,可能有点懵圈 ,我们来慢慢看代码
先看我们定义了一个Sudoku的变量未 511,你会觉得这511是干嘛的我们应该要对这类数字敏感,如255,你就知道255对应着
八位的11111111(不知道可是八个一老花眼看不清@。@)那么511对应的事九位的111111111,要这个干嘛,先不说
我们看看后面的操作因为是字符所以‘0’的值对应int的48这里减48就是对应起来(ASCII码)
然后来了Sudoku>>(k-1)&1这个是干什么呢,就是取Sudoku的第k位进制
判断是不是1是1这位就取反代表有这行或者这列或者九宫格有这么个数
这k位取反的操作Sudoku=Sudoku^(1<<(k-1))
这就是这些代码的核心明白了里面的位操作,再回来看代码就很容易了
另外这题时间限制比较高,任何时间复杂度高的算法都别提交了
那么这题就结束了看下一题
136. Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
题目说一组数列,全部都是两两成对的,但是有一个单身狗,find it
这题诚然开个hash表就可以找到了但是我们有更好的方案
先po代码
int singleNumber(int* nums, int numsSize)
{
int res=0;
for(int i=0;i
ok我们来分析就是定义一个数然后他等于所有的数列的数的异或值
为什么呢因为a^a=0并且异或满足交换律,这题就讲解这么多,说多无益,到这知道就知道了不知道就不知道了
下题
191. Number of 1 Bits
英文题目我都懒得打了,就是数一个数二进制中1的个数
先po代码
int hammingWeight(uint32_t n)
{
int res=0;
while(n)
{
if((n>>1)<<1!=n)
{
++res;
}
n>>=1;
}
return res;
}
直接解释(n>>1)<<1!=n代表我们先把最后一位移出去再补上0如果相等说明一出去的0
不相等移出去的是1结束
总结
1.取第k位二进制数
n>>(k-1)&1
2.第k位取反
n=n^(1<<(k-1))
3.这个怎么写两个数异或吧
a^a=0
4.判断最后一位是为1
(n>>1)<<1!=n
好,这次到这里,下次的代码会更加精彩(可能吧(,。,))