leetcode 第36 题 , 题目如下,所示.


分析:
  • 该题需要判断每一行,每一列,每一块是否有重复数字,最容想到的就是分别写代码去判断每一行,每一列是否有重复数字,用一个数组做存储容器,出现的数字作为数组的下标,出现为1,没有出现为0,这样在O(1)的时间内就可以知道数字是否重复,但是这样写代码比较冗余,需要遍历三遍,那能不能只遍历一遍呢?当然可以.
思路:

1 , 抛弃刚刚所想,更节省存储空间的话,我们可以用一个数字作为一个存储容器,利用数字二进制下的后九位,对应下标位置出现过变为1,没有出现保持0,以数字num为例,比如出现数字6,那么num的倒数第6位变为1,算数表达为:num | (1<<6),如果判断某一位是否为1,比如判断倒数第三位是否为1, (num>>3) & 1.

  • 这里补充一下位运算基本知识.
  • 按位或: |
    有一个为1,则结果为1.否则该位结果为0
  • 按位与: &
    必须两个均为1,结果为1,否则该位结果为0.
  • 按位异或: ^
    相同为0,不同为1.

2 , 如果想要只遍历一遍,那么我们就需要推导坐标之间的关系.

推导过程:

(1). 我们假设外层循环变量为ii,内层循环变量为jj,那么board[i][j]唯一表示第i 行,第j列的元素.
(2). 如何表示小宫内的格子?

  • 由于一共有9个小宫,每个小宫有9格,我们可以先找到每个小宫的第0个元素坐标,然后加上每个元素相对应第0个元素的偏移量就可以.

  • 如图所示,九个小宫用不同的颜色表示,每个小宫的左上角为小宫的第0个格子(深色标记)。我们设标号顺序为从左往右,从上往下。

  • 那么:第i个小宫的第0个元素就是(3*(i/3),3*(i%3)),

  • 每个小宫第j个元素相对于第0个元素的偏移量也就是(j/3,j%3)

  • 那么第i小宫第j个元素也就是(3∗(i/3)+j/3,3∗(i%3)+j%3)

接下来就是代码了.如下.
class Solution {public boolean isValidSudoku(char[][] board) {if(board==null||board.length==0) return false;for(int i=0;i<9;i++){int line=0,list=0,square=0;                 //初始化三个容器for(int j=0;j<9;j++){int val_line=(int)board[i][j]-48;       //获取每一行的值int val_list=(int)board[j][i]-48;       //每一列的值int val_sq=(int)board[3*(i/3)+j/3][3*(i%3)+j%3]-48;  //每一宫的值if(val_line>0)                           //'.'的ASCLL码是46,转换为数字小于0.line=sodokuer(val_line,line);if(val_list>0)list=sodokuer(val_list,list);if(val_sq>0)square=sodokuer(val_sq,square);if(line==-1||list==-1||square==-1)return false;}}return true;}private int sodokuer(int val, int res){//如果对应位上的数值为1,说明已经出现过,返回-1,否则对应位设为1return ((res>>val) & 1) == 1 ? -1 : res ^ (1<<val);  }
}

有效的数独-位运算(详细解释)-只需遍历一遍数组相关推荐

  1. python >>按位运算符号解释

    具体可参考C语言的按位运算符 1. 数字2表示的为10进制,换成对应的2进制:10 2. << 表示左移动,5表示要移位的位数 即现在的2进制数为:1000000 3. 对应的10进制数据 ...

  2. 位运算笔记(个人笔记)

    文章目录 声明 前言 #各个进制之间的转化# 一.位运算的解释 1.按位与(&) 2.按位或(|) 3.按位异或(^) 4.按位取反(~) 5.左移位(<<) 6.右移位(> ...

  3. php使用位运算来实现日留存的算法

    文章目录 一.前言 二.位运算实现逻辑 1.逻辑部分如下 2.存入数据库部分的代码 3.查询数据库示例 4.php读取字段,并用位与运算解开存留信息 三.偶然发现的bug(php大数计算问题) 1.科 ...

  4. Leetcode 第1342题:将数字变成 0 的操作次数 (位运算解题法详解)

    前言 Leetcode第1342题如果用直观方式来做,其实是一道难度极低的题目.但是如果采用位运算的方式来解,则会涉及许多有趣的衍生知识点,了解其背后的原理对我们认识位运算有很大的帮助.现在,就让我们 ...

  5. 位运算详解+竞赛常见用法总结

    目录 一.位运算详解 二.位运算应用 1.快速幂 2.给定一个数组A, 长度为n,求下面这段程序的值 3.数数字 4.数数字 2 5.nim博弈问题: 6.树状数组 7.判断一个数x是不是2的某次方 ...

  6. 蓝桥备赛第一周2021.1.11 递归 枚举 位运算

    文章目录 递归实现指数型枚举 递归指数型枚举 方法1:肯定是2^n行,所以直接就是上一个动态m从0到n加一堆空行 方法2:以最新的值为n为结束,遇到为0的不输出,用完要恢复为0 递归实现排列型枚举 非 ...

  7. LeetCode 2032. 至少在两个数组中出现的值(哈希/位运算)

    文章目录 1. 题目 2. 解题 2.1 哈希查找 2.2 位运算 1. 题目 给你三个整数数组 nums1.nums2 和 nums3 ,请你构造并返回一个 不同 数组,且由 至少 在 两个 数组中 ...

  8. Python位运算用途以及用法

    1.  什么是位运算? 按位运算就把数字转换为二进制的数字来运算的一种运算形式.在计算机系统中,数值一律用补码来表示(存储). 在许多古老的CPU上, 位运算比加减运算略快, 通常位运算比乘除法运算要 ...

  9. 全排列(dfs、小白、详细解释)

    目录 主函数 用来排序的函数 详细过程 代码 从键盘输入一个没有重复元素的字符串,输出这个字符串所有字符的全排列 输入格式: 一个字符串,输入保证字符串中没有重复的字符,字符串的长度不超过10,字符串 ...

最新文章

  1. Notification 浏览器右下角弹出提示消息
  2. 贴吧粉丝怎么全部移除_教程:高达模型贴大面积的水贴纸张要如何操作
  3. ssh网络服务的搭建和配置
  4. 读书笔记 — Java高并发程序设计 — 第二章 — 基础(上)
  5. 奥维互动地图APP不能用了怎么办?有没有什么替代软件?
  6. 【狂神说Java】Spring Boot笔记
  7. 为什么计算机能读懂 1 和 0 ?
  8. Fabric-ca与现有fabric网络组织绑定
  9. 工程流体力学笔记暂记43 (收缩喷管中的流动)
  10. --TEXT()函数与TEXT()有什么区别
  11. 毕业设计 Stm32人体心率血氧无线监测系统 - 单片机 物联网
  12. mcnpf5输出结果_MCNP入门教程
  13. 三、Cypher的使用(知识图谱构建射雕人物关系)
  14. service_cmn
  15. 第十一届“泰迪杯”数据挖掘挑战赛携“十万”大奖火热来袭
  16. python 大智慧 dll 下单_大智慧下单
  17. fiddle的常见功能使用
  18. php 解析网页慢,网页访问变慢的原因分析及优化
  19. Ghost,要注意SID,尤其是域用户
  20. 人类究竟对地球做过什么?

热门文章

  1. 儿时经典电影回顾,你看过几部?
  2. u盘装linux系统简单方法,用u盘安装linux系统的简单方法教程
  3. 设置IP代理错误:“[WinError 10061] 由于目标计算机积极拒绝,无法连接”解决办法
  4. 重学计算机组成原理(十一)- 门电路的千里传音
  5. I/O 的五分钟法则
  6. mp3格式如何转换为ogg
  7. JAVA大数据后台管理系统
  8. Windows Server 2008 安装教程——图文小白版(附下载地址)
  9. ps技巧:从黑白图片中创建蒙版
  10. Linux命令 nslookup,每天学一个 Linux 命令(69):nslookup