leetcode之模拟刷题总结2
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode之模拟刷题总结2相关的知识,希望对你有一定的参考价值。
leetcode之模拟刷题总结2
1-重塑矩阵
题目链接:题目链接戳这里!!!
思路:模拟矩阵重塑过程,如果原始矩阵和重塑矩阵的元素个数不同,则不能完成重塑,反之,可以完成重塑,先把原始矩阵转换一维数组,再将一维数组转换为重塑矩阵。
AC代码如下:
class Solution
public int[][] matrixReshape(int[][] mat, int r, int c)
if(r*c!=mat.length*mat[0].length)
return mat ;
int [] temp = new int [r*c] ;
int idx = 0 ;
int [][] res = new int [r][c] ;
for(int i=0; i<mat.length; i++)
for(int j=0; j<mat[0].length; j++)
temp[idx++] = mat[i][j] ;
idx = 0 ;
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
res[i][j] = temp[idx++] ;
return res ;
也可以这样写,直接将二维矩阵转换成对应的二维矩阵,效率更高。
class Solution
public int[][] matrixReshape(int[][] mat, int r, int c)
if(r*c!=mat.length*mat[0].length)
return mat ;
int [][] res = new int [r][c] ;
for(int i=0; i<r*c; i++)
res[i/c][i%c] = mat[i/mat[0].length][i%mat[0].length] ;
return res ;
2-Fizz Buzz
题目链接:题目链接戳这里!!!
思路:很水的题,直接判断,加入集合就可以。
class Solution
public List<String> fizzBuzz(int n)
List<String> list = new ArrayList<>() ;
for(int i=1; i<=n; i++)
if(i%3==0 && i%5==0)
list.add("FizzBuzz") ;
else if(i%3==0)
list.add("Fizz") ;
else if(i%5==0)
list.add("Buzz") ;
else
list.add(String.valueOf(i)) ;
return list ;
3-求解方程
题目链接:题目链接戳这里!!!
思路:将字符串所有“-”符号前面添加“+“,然后按照等号将字符串划分成两段,左边的和右边的都按照”+“划分成字符串数组,然后对左右两个字符串进行处理,根据系数判断有无解。
AC代码如下:
class Solution
public String solveEquation(String equation)
int idx = 0 ;
for(int i=0; i<equation.length(); i++)
if(equation.charAt(i)=='-')
equation = equation.substring(0,i) + "+" + equation.substring(i) ;
i++ ;
for(int i=0; i<equation.length(); i++)
if(equation.charAt(i)=='=')
idx=i ;
String left = equation.substring(0,idx) ;
String right = equation.substring(idx+1,equation.length()) ;
String [] l = left.split("[+]") ;
String [] r = right.split("[+]") ;
int a1=0, a2=0, b1=0, b2=0 ;
for(int i=0; i<l.length; i++)
if( !l[i].equals("") && !contains(l[i]) )
a1 += Integer.parseInt(l[i]) ;
else if(!l[i].equals("") && contains(l[i]))
if(l[i].length()==1)
b1 += 1 ;
else if(l[i].length()==2 && l[i].charAt(0)=='-')
b1 -= 1 ;
else
b1 += Integer.parseInt(l[i].substring(0,l[i].length()-1)) ;
for(int i=0; i<r.length; i++)
if(!contains(r[i]) && !r[i].equals(""))
a2 += Integer.parseInt(r[i]) ;
else if(contains(r[i]) && !r[i].equals(""))
if(r[i].length()==1)
b2 += 1 ;
else if(r[i].length()==2 && r[i].charAt(0)=='-')
b2 -= 1 ;
else
b2 += Integer.parseInt(r[i].substring(0,r[i].length()-1)) ;
if(b1!=b2)
return "x=" + (a2-a1)/(b1-b2) ;
else if(a1!=a2)
return "No solution" ;
else
return "Infinite solutions" ;
public boolean contains(String s)
if(s.equals(""))
return false ;
if(s.charAt(s.length()-1)=='x')
return true ;
return false ;
4-机器人能否返回原点
题目链接:题目链接戳这里!!!
思路:记录U,D,R,L的个数,当且仅当U等于D且R等于L时候,可以 返回到原点,否则,不能返回到原点。
class Solution
public boolean judgeCircle(String moves)
int cntU=0, cntD=0, cntL=0, cntR=0 ;
for(int i=0; i<moves.length();i++)
if(moves.charAt(i)=='U')
cntU ++ ;
else if(moves.charAt(i)=='D')
cntD ++ ;
else if(moves.charAt(i)=='L')
cntL ++ ;
else if(moves.charAt(i)=='R')
cntR ++ ;
return cntR==cntL && cntD==cntU ;
5-模拟机器人行走
题目链接:题目链接戳这里!!!
思路:用set集合存储障碍物坐标,定义四个方向,根据命令模拟运动,同时计算最大欧式距离。
AC代码如下:
class Solution
public int robotSim(int[] commands, int[][] obstacles)
Set<String> set = new HashSet<>() ;
for(int [] obstacle : obstacles) //set集合存储障碍物坐标
set.add(obstacle[0]+","+obstacle[1]) ;
//定义北,东,南,西四个方向
int [] dx = 0,1,0,-1 ;
int [] dy = 1,0,-1,0 ;
int cur=0, x=0, y=0;
int tx, ty ;
int ans = 0 ;
for(int command:commands)
if(command>0)
for(int i=0; i<command; i++)
tx = x + dx[cur] ;
ty = y + dy[cur] ;
if(set.contains(tx+","+ty))
break ;
x = tx ;
y = ty ;
ans = Math.max(ans,x*x+y*y) ;
else
cur = command==-1 ? (cur+1)%4 : (cur+3)%4 ;
return ans ;
6-棒球比赛
题目链接:题目链接戳这里!!!
思路1:转换成list结果完成相应的操作。
由于类型的转换较多,效率不是很高。
class Solution
public int calPoints(String[] ops)
List<String> list = new ArrayList<>() ;
for(int i=0; i<ops.length; i++)
list.add(ops[i]) ;
for(int i=0; i<list.size(); i++)
if(list.get(i).equals("C"))
list.remove(i) ;
list.remove(i-1) ;
i -= 2 ;
else if(list.get(i).equals("D"))
int value = Integer.parseInt(list.get(i-1))*2 ;
list.set(i,String.valueOf(value)) ;
else if(list.get(i).equals("+"))
int sum = Integer.parseInt(list.get(i-1))+Integer.parseInt(list.get(i-2)) ;
list.set(i,String.valueOf(sum)) ;
int s = 0 ;
for(int i=0; i<list.size(); i++)
s += Integer.parseInt(list.get(i)) ;
return s ;
思路2:直接用整数数组记录,效率提升了很多。
class Solution
public int calPoints(String[] ops)
int [] res = new int [ops.length] ;
int sum = 0 ;
int j = 0 ;
for(int i=0; i<ops.length; i++)
switch(ops[i])
case "C": res[j-1]=0 ;j--; break ;
case "D":res[j] = 2*res[j-1]以上是关于leetcode之模拟刷题总结2的主要内容,如果未能解决你的问题,请参考以下文章