leetcode之模拟刷题总结3
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode之模拟刷题总结3相关的知识,希望对你有一定的参考价值。
leetcode之模拟刷题总结3
1-转置矩阵
题目链接:题目链接戳这里!!!
思路:对应行的值放到对应列即可,easy题一道,先做一道easy题,自我安慰安慰。
class Solution
public int[][] transpose(int[][] matrix)
int m = matrix.length ;
int n = matrix[0].length ;
int [][] ans = new int [n][m] ;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
ans[j][i] = matrix[i][j] ;
return ans ;
2-输出比赛匹配对
题目链接:题目链接戳这里!!!
思路:team[i-1]表示每个队伍的初始情况,一共需要经过第一层循环次数的配对,每轮配对,依次将第一个和最后一个配对,第二个和倒数第二个配对,依次类推。
class Solution
public String findContestMatch(int n)
String [] team = new String[n] ;
for(int i=1; i<=n; i++)
team[i-1] = i + "" ;
for(;n>1;n/=2)
for(int i=0; i<n/2; i++)
team[i] = "(" + team[i] + "," + team[n-i-1] + ")" ;
return team[0] ;
3-翻转图像
题目链接:题目链接戳这里!!!
思路:image[i][j] != image[i][-1-j],如:0, 1,先交换变成1, 0,再取非又变回0, 1,故什么都不做。
image[i][j] == image[i][n-1-j],同时取非。
class Solution
public int[][] flipAndInvertImage(int[][] image)
int m = image.length;
int n = image[0].length ;
for(int i=0; i<m; i++)
for(int j=0; j<(n%2==0 ? n/2 : n/2+1); j++)
if(image[i][j]==image[i][n-j-1])
if(j!=n-j-1)
image[i][j] = 1 - image[i][j] ;
image[i][n-j-1] = 1 - image[i][n-j-1] ;
else
image[i][j] = 1 - image[i][j] ;
return image ;
4-困于环中的机器人
题目链接:题目链接戳这里!!!
思路:(x,y)模拟当前坐标,face模拟当前面朝方向,一轮指令下来,只有不在原点并且面朝方向未改变的才最终回不到原点。
class Solution
public boolean isRobotBounded(String instructions)
int x = 0, y = 0 ;
int face = 0 ;
int [] dx = -1,0,1,0 ;
int [] dy = 0,1,0,-1 ;
char [] c = instructions.toCharArray() ;
for(char ch : c)
switch(ch)
case 'R' : face = (face+1)%4 ; break ;
case 'L' : face = (face+3)%4 ; break ;
case 'G' : x += dx[face] ; y += dy[face]; break ;
return (x==0 && y==0) || (face % 4 != 0) ;
5-分糖果II
题目链接:题目链接戳这里!!!
思路:模拟分糖果的过程就可以,只要有糖果就可以继续分,每次糖果数大于等于应分的数量n,就分n,否则,分掉剩余全部糖果。
class Solution
public int[] distributeCandies(int candies, int num_people)
int [] ans = new int [num_people] ;
int n = 1 ;
int i = 0 ;
while(candies>0)
if(candies-n>=0)
ans[i] += n ;
candies -= n ;
n++ ;
i = (i+1)%num_people ;
else
ans[i] += candies ;
break ;
return ans ;
6-查询带键的排列
题目链接:题目链接戳这里!!!
思路:使用List集合模拟数组p的元素变动情况,每次将相应的元素从List集合删除并插入List集合头部。
class Solution
public int[] processQueries(int[] queries, int m)
List<Integer> p = new ArrayList<>() ;
for(int i=0; i<m; i++)
p.add(i+1) ;
int [] ans = new int [queries.length] ;
for(int i=0; i<queries.length; i++)
int x = f(queries[i],p) ;
ans[i] = x ;
p.remove(x) ;
p.add(0,queries[i]) ;
return ans ;
public int f(int value, List<Integer> p)
for(int i=0; i<p.size(); i++)
if(value==p.get(i))
return i ;
return 0 ;
7-奇数值单元格的数目
题目链接:题目链接戳这里!!!
思路:使用两个数组row和column分别标记行和列是否是奇数。
class Solution
public int oddCells(int m, int n, int[][] indices)
boolean [] row = new boolean[m] ;
boolean [] column = new boolean[n] ;
int r = 0, c = 0 ;
for(int i=0; i<indices.length; i++)
row[indices[i][0]] = !row[indices[i][0]] ;
column[indices[i][1]] = !column[indices[i][1]] ;
for(int i=0; i<m; i++)
if(row[i])
r ++ ;
for(int i=0; i<n; i++)
if(column[i])
c ++ ;
return r*n + c*m - 2*r*c ;
8-用栈操作构建数组
题目链接:题目链接戳这里!!!
思路:模拟整个过程就可以,从1到n,每次值等于target时候,将Push加入list集合,每次值小于target则需要进行target-i的Push和Pop。
class Solution
public List<String> buildArray(int[] target, int n)
List<String> ans = new ArrayList<>() ;
int j = 0 ;
for(int i=1; i<=n; i++)
if(j > target.length-1 || target[j]<i)
break ;
if(target[j]==i)
ans.add("Push") ;
j ++ ;
else if(target[j]>i)
for(int k=0; k<target[j]-i; k++)
ans.add("Push") ;
ans.add("Pop") ;
i += (target[j]-i-1) ;
return ans ;
9-换酒问题
题目链接:题目链接戳这里!!!
思路:模拟换酒过程就可以,只要当前的酒瓶数大于兑换数,则循环,每轮循环求出喝掉的酒数res。同时更新酒瓶数numBottles。
class Solution
public int numWaterBottles(int numBottles, int numExchange)
int res = 0 ;
int temp = numBottles ;
while(numBottles>=numExchange)
int n = numBottles / numExchange ;
res += (numBottles / numExchange) ;
numBottles = (numBottles%numExchange) + n ;
return res+temp ;
10-找出数组游戏的玩家
题目链接:题目链接戳这里!!!
思路1:用list集合模拟整个过程,尽管也能AC,但是效率较低。
class Solution
public int getWinner(int[] arr, int k)
int [] res = new int [1000000] ;
int max = 0 ;
List<Integer> list = new ArrayList<>() ;
for(int i=0; i<arr.length; i++)
list.add(arr[i]) ;
max = Math.max(max,arr[i]) ;
while(true)
if(list.get(0)==max || list.get(1)==max)
return max ;
if(list.get(0)>list.get(1))
int t = list.get(0) ;
res[t] ++ ;
int temp = list.get(1) ;
list.remove(1) ;
list.add(temp) ;
if( res[t]==k)
return t ;
else
int t = list.get(1) ;
res[t] ++ ;
int temp = list.get(0) ;
list.remove(0) ;
list.add(temp) ;
if(res[t]==k)
return t ;
11-按既定顺序创建目标数组
题目链接:题目链接戳这里!!!
思路:先更新index数组,在更新结果数组ans。
class Solution
public int[] createTargetArray(int[] nums, int[] index)
int len = nums.length ;
int [] ans = new int [len] ;
for(int i=0; i<len; i++)
for(int j=0; j<i; j++)
index[j] += (index[j]>=index[i]) ? 1 : 0 ;
for(int i=0; i<ans.length; i++)
ans[index[i]] = nums[i] ;
return ans ;
12-可以攻击国王的王后
题目链接:题目链接戳这里!!!
思路:模拟过程,是用国王去攻击王后,沿着8个方向攻击,每次只要能攻击到一个就结束当前方向的攻击,如果超过边界仍攻击不到则结束当前方向的攻击。
class Solution
int dx[] = -1, -1, -1, 0, 1, 1, 1, 0;
int dy[] = -1, 0, 1, 1, 1, 0,-1,-1;
public List<List<Integer>> queensAttacktheKing(int[][] queens以上是关于leetcode之模拟刷题总结3的主要内容,如果未能解决你的问题,请参考以下文章