用dw做网站的空格怎么打/seo产品推广
⭐️寒假新坑——代码之狐的每日做题笔记
37. 解数独-Hard
题目描述:
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.'
表示。
解题思路:
-
使用数组保存每一行,列,每个九宫格的状态(已经填入的数字,使用二进制位表示0000……01表示1已经填入)
-
每次填入一个格子时,利用该格所在行,列,九宫格的状态取并集,如果不全是1,表示可能填入的数字
-
“试探”每个可能,填入一个数字后更新状态,找到下一个格子,直到冲突(该格子无数可填)
-
若冲突,记得回退状态(具体操作见代码)
-
直到最后一个格子,如果已经填入,或者有数可填,即解决问题
代码实现:
class Solution {int [][] k=new int[9][3];//[0][0]表示第0行统计,[0][2]表示第0个九宫格统计char[][] b;public void solveSudoku(char[][] board) {b=board;for(int i=0;i<9;i++){for(int n=0;n<9;n++){char mid=board[i][n];if(mid!='.'){k[i][0]=k[i][0]|(1<<(int)(mid-'1'));//i行k[n][1]= k[n][1]|(1<<(int)(mid-'1'));//n列k[i/3*3+n/3][2]=k[i/3*3+n/3][2]|(1<<(int)(mid-'1'));//i/3*3+y/3个九宫格}}}DFS(0,0);board=b;}public boolean DFS(int x,int y){if(b[x][y]!='.'){if(x==8&&y==8){return true;}else if(y==8){return DFS(x+1,0);}else{return DFS(x,y+1);}}int cur=k[x][0] | k[y][1] | k[x/3*3+y/3][2];for(int i=0;i<9;i++){if((cur&(1<<i))==0){b[x][y]=(char)('1'+i);k[x][0]|=(1<<i);k[y][1]|=(1<<i);k[x/3*3+y/3][2]|=(1<<i);if(x==8&&y==8){return true;}else if(y==8){if(DFS(x+1,0))return true;}else {if(DFS(x,y+1))return true;}//如果后面的DFS不行,回溯状态k[x][0]^=(1<<i);k[y][1]^=(1<<i);k[x/3*3+y/3][2]^=(1<<i);b[x][y]='.';}}return false;}
}
2047. 句子中的有效单词数
句子仅由小写字母('a'
到 'z'
)、数字('0'
到 '9'
)、连字符('-'
)、标点符号('!'
、'.'
和 ','
)以及空格(' '
)组成。每个句子可以根据空格分解成 一个或者多个 token ,这些 token 之间由一个或者多个空格 ' '
分隔。
如果一个 token 同时满足下述条件,则认为这个 token 是一个有效单词:
- 仅由小写字母、连字符和/或标点(不含数字)。
- 至多一个 连字符
'-'
。如果存在,连字符两侧应当都存在小写字母("a-b"
是一个有效单词,但"-ab"
和"ab-"
不是有效单词)。 - 至多一个 标点符号。如果存在,标点符号应当位于 token 的 末尾 。
这里给出几个有效单词的例子:"a-b."
、"afad"
、"ba-c"
、"a!"
和 "!"
。
给你一个字符串 sentence
,请你找出并返回 sentence
中 有效单词的数目 。
class Solution {public int countValidWords(String sentence) {int count=0;//查找每个单词开头for(int i=0;i<sentence.length();i++){if(sentence.charAt(i)!=' '&&(i==0||sentence.charAt(i-1)==' ')){if(judgeH(sentence,i)){count++;}}}return count;}//输入单词开头,判断是否符合规定格式public boolean judgeH(String s,int i){char cur=s.charAt(i);//count作为-出现与否的标志boolean count=false;//历遍单词while(i<s.length()&&cur!=' '){//单词中不存在数字if(cur>='0'&&cur<='9'){return false;}else if(cur=='-'){//-前后需要一个字母if(i+1>=s.length()||s.charAt(i+1)<'a'||s.charAt(i+1)>'z'){return false;}else if(i==0||s.charAt(i-1)<'a'||s.charAt(i-1)>'z'){return false;}else if(count){//出现过一次-,这是第二次出现return false;}else{count=true;}}else if(cur==','||cur=='.'||cur=='!'){//标点符号需要在末尾if(i+1<s.length()&&s.charAt(i+1)!=' '){return false;}}i++;if(i<s.length())cur=s.charAt(i);}return true;}
}
结尾
题目来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems
⭐️关注作者,带你刷题,从简单的算法题了解最常用的算法技能(寒假每日一题)
⭐️关注作者刷题——简单到进阶,让你不知不觉成为无情的刷题机器,有问题请私信