LeetCode 位运算操作集锦(一)

大家好,我是刘天昊,这次给大家带来的是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;i<boardRowSize;i++)
    {
        Sudoku=511;
        for(int j=0;j<boardColSize;j++)
        {
                int k=board[i][j]-48;
                if(k>0&&k<10)
                {
                    if(Sudoku>>(k-1)&1==1)
                    {
                        Sudoku=Sudoku^(1<<(k-1));
                    }
                    else
                    {
                        return false;
                    } 
                }
        }
    }
    for(int i=0;i<boardRowSize;i++)
    {
        Sudoku=511;
        for(int j=0;j<boardColSize;j++)
        {
                int k=board[j][i]-48;
                if(k>0&&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<numsSize;i++)
    {
        res^=*(nums+i);
    }
    return res;
}
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

好,这次到这里,下次的代码会更加精彩(可能吧(,。,))




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值