初级算法(三)
1、引言
1、有效的数独:要求数字1-9在每一行只能出现一次,数字1-9在每一列只能出现一次。数字1-9在每一个小九格中只能出现一次
2、旋转图像:将一个二维矩阵,将图像顺时针旋转90度
3、反转字符串:将一个字符数组,反转数字
2、有效的数独
这一波主要是利用Java中set集合中不能存在重复元素。
//使用hashset数据结构,去重
//执行用时:3ms,内存消耗:41.7MB
public boolean isValidSudoku(char[][] board) {
for (int i = 0; i < 9; i++) {
HashSet setLine=new HashSet();
HashSet setCol=new HashSet();
HashSet setBox=new HashSet();
for (int j = 0; j < 9; j++) {
if(board[i][j]!='.'&&!setLine.add(board[i][j]))
return false;
if(board[j][i]!='.'&&!setCol.add(board[j][i]))
return false;
int a=(i/3)*3+j/3;
int b=(i%3)*3+j%3;
if(board[a][b]!='.'&&!setBox.add(board[a][b]))
return false;
}
}
return true;
}
3、旋转图像
//找规律,先上下交换,再对角线交换
//执行用时:0ms,内存消耗:40MB
public void rotate(int[][] matrix) {
int n = matrix.length;
if(n==1)
return;
for (int i = 0; i < n/2; i++) {
int[] temp=matrix[i];
matrix[i] =matrix[n-1-i];
matrix[n-i-1]=temp;
}
//对角线交换
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
int temp=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=temp;
}
}
}
3、反转字符串
方法一:双指针。方法二:循环
//方法一:双指针
//执行用时:0ms,内存消耗47.9MB
public void reverseString(char[] s) {
if(s.length==1)
return;
int i=0,j=s.length-1;
while(i<j){
char temp=s[i];
s[i]=s[j];
s[j]=temp;
i++;
j--;
}
}
//方法二:使用for循环,两两交换
//执行用时:0ms,内存消耗:48.3MB
public void reverseString2(char[] s) {
if (s.length == 1)
return;
for (int i = 0; i < s.length / 2; i++) {
char temp = s[i];
s[i] = s[s.length - 1 - i];
s[s.length - 1 - i] = temp;
}
}