二维数组
48. 旋转图像
将一个二维矩阵顺时针旋转90°
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
123 741
456 ----> 852
789 963
class Solution {
public void rotate(int[][] matrix) {
int n=matrix.length;
int[][] matrixs=new int[n][n];
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
matrixs[i][j]=matrix[n-1-j][i];
}
}
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
matrix[i][j]=matrixs[i][j];
}
}
}
}
总结
顺时针旋转90°matrixs[i][j]=matrix[n-1-j][i];
逆时针旋转90°matrixs[i][j]=matrix[j][n-1-i];
面试题 01.08. 零矩阵
二维矩阵如果某个元素为0,该行该列都改为0
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
class Solution {
public void setZeroes(int[][] matrix) {
int n = matrix.length;
int[] row = new int[n];
int[] colum = new int[matrix[0].length];
for(int i = 0; i < n; i ++){
for(int j = 0; j < matrix[0].length; j ++){
if(matrix[i][j]==0){
row[i]=1;
colum[j]=1;
}
}
}
for(int i = 0; i < n; i ++){
for(int j = 0; j < matrix[0].length; j ++){
if(row[i]==1||colum[j]==1){
matrix[i][j]=0;
}
}
}
}
}
总结
注意利用bool值来记录某些特别的规则
498. 对角线遍历
498. 对角线遍历
边界题感觉
先说思路
我首先想到模拟的特殊情况(也就是溢出的情况)紧接着分为两部分,这里图我是把特殊边界单独处理放在while外
但是该代码 只适用方阵(本来打算改进为一般矩阵,但是代码太臭了,还是放弃吧-.-···
class Solution {
public int[] findDiagonalOrder(int[][] mat) {
int n=mat.length;
int m=mat[0].length;
int[] ans = new int[m*n];
ans[0]=mat[0][0];
int row=0,colum=1,index=1;
for(int i = 1; i < n; i ++){
if(row==0){
while(colum!=0){
ans[index]=mat[row][colum];
index++;
row++;
colum--;
}
ans[index]=mat[row][colum];
index++;
row++;
}
else if(colum==0){
while(row!=0){
ans[index]=mat[row][colum];
index++;
row--;
colum++;
}
ans[index]=mat[row][colum];
index++;
colum++;
}
else if(row>=n||colum>=n){
break;
}
}
if(row>=n){
row--;
colum++;
}
if(colum>=n){
row++;
colum--;
}
for(int i = 1; i < m; i ++){
if(row==(n-1)){
while(colum!=(m-1)){
ans[index]=mat[row][colum];
row--;
index++;
colum++;
}
ans[index]=mat[row][colum];
index++;
row++;
}
else if(colum==(m-1)){
while(row!=(n-1)){
ans[index]=mat[row][colum];
row++;
colum--;
index++;
}
ans[index]=mat[row][colum];
index++;
colum++;
}
if(row==(n-1)&&colum==(n-1)){
ans[index]=mat[n-1][m-1];
break;
}
}
return ans;
}
}
第二次思路:
先分向上和向下两种排序,用%2来达成不同while,第一次的思路是分两半从对角线开始分析
(这里我发现矩阵分长矩阵和宽矩阵,以为我的适合于长矩阵,因为我的判断条件第二部分为是否为最后一行或者最后一列,结果还是不对)
class Solution {
public int[] findDiagonalOrder(int[][] mat) {
if(mat.length==0)return new int[0];
int m=mat.length;
int n=mat[0].length;
int count=m+n-1;
int[] answer=new int[m*n];
int row=0;
int colum=0;
int index=0;
for(int i = 0; i < count; i ++){
if(i%2==0){
while(row>=0&&colum<n){
answer[index]=mat[row][colum];
index++;
row--;
colum++;
}
if(colum>=n){
row=row+2;
colum--;
}
else{
row++;
}
}
else{
while(row<m&&colum>=0){
answer[index]=mat[row][colum];
index++;
row++;
colum--;
}
if(row>=m){
colum=colum+2;
row--;
}
else{
colum++;
}
}
}
return answer;
}
}
字符串
1.如果你确实希望你的 字符串是可变的,则可以使用 toCharArray 将其转换为字符数组。
2.如果你 经常必须连接字符串,最好使用一些其他的数据结构,如 StringBuilder 。
3.当我们使用 == 时,它实际上会比较这两个对象是否是同一个对象。
4.字符串在java中创建就不可变。
14. 最长公共前缀
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0){
return "";
}
String ans=strs[0];
for(int i = 1; i < strs.length; i ++){
int j = 0;
for(; j < ans.length()&&j < strs[i].length(); j++){
if(ans.charAt(j)!=strs[i].charAt(j)){
break;
}
}
ans=ans.substring(0,j);
if(ans.equals("")){
return ans;
}
}
return ans;
}
}
总结
substring:
substring(0,a)--->含头不含尾
substring(a)--->删除前a个字符
数组.length
string.length()