开启蓝桥杯备战计划,每日练习算法一题!!坚持下去,想必下一年的蓝桥杯将会有你!!
笔者是在力扣上面进行的刷题!!由于是第一次刷题!找到的题目也不咋样!所以,就凑合凑合吧!笔者打算从数据结构开始刷起,毕竟现在刚刚接触到数据结构!!
在力扣上找到的刷题链接为:
https://leetcode.cn/study-plan/data-structures/?progress=yqv80ci
力扣是一个很不错的刷题平台!
跟着笔者走起来吧!!加油干!
566. 重塑矩阵
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]
试列2:
输入:mat = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]
友谊提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 100
-1000 <= mat[i][j] <= 1000
1 <= r, c <= 300
首先对于二维数组,我们需要知道的是:在Java的二维数组中,每一行每一列,如何去求出来??这个在一开始就难道了我!!但是,身为青少年好好学习的我!怎能被打到??于是,用了一个函数,这个复杂的问题,就被聪明的我解决了!!
下面请看笔者的代码:如何来求出二维数组的行数,列数的!
public static void test(int[][] mat ) {
System.out.println(mat.length); //求出 的是二维数组的行数 : mat.length
System.out.println(mat[0].length); //求出二维数组第0行有多少个元素
System.out.println(mat[1].length);
System.out.println("==============");
System.out.println(mat[2].length); //数组越界进行报错!
}
public static void main(String[] args) {
int[][] mat = {{1,2,3,4},{5,4,3,2,1,7,6}};
test(mat);
}
经过上述的代码的使用,那么请看代码的运行结果:
我们根据上述代码的一一对比,就可以看出来最后如何在Java当中使用二维数组的行和列了!!
那么,我们接下来进入言归正传!!
对于该题目,我们首先要想到的是:
必须要合乎情理!!要不然就会直接返回原来的数组!!因此,我们需要进行简单的判断
然后就是最艰难的数组转化部分了!
经过上述的简单思考,我们可以有着下列的代码:
public static int[][] test1(int[][] mat , int r ,int c) {
//重构后的数组,需要合乎情理
int m= mat.length; //行数
int n=mat[0].length; //列数
if(m*n != r*c) {
return mat;
}
//将mat[m][n]转化为array[r][c]
int[][] array = new int[r][c];
int ret=0; //行
int cur=0; //列
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (cur == c ) {
ret =ret +1;
cur =0;
}
array[ret][cur] = mat[i][j];
cur = cur +1;
}
}
return array;
}
其实,这个代码,看起来也不是很难,但是,最为艰难的还是哪个想法!!没有想法,其实看起来就是很难了!!
118. 杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
提示:
1 <= numRows <= 30
这个杨辉三角我们在之前C语言阶段,及其Java的初学阶段,都有过学习!但是,既然这次放到了数据结构这一块来进行学习,那么,肯定不是简简单单的代码就能打印出来的了!现在将用ArrayList顺序表来进行打印!!高难度哟!!
首先,我们可以根据力扣当中给的默认代码说起:
public static List<List<Integer>> generate1(int numPows)
看到这个,我们首先要想到的是:函数的返回值类型是:List<List<Integer>> 这个是我们之前所没有接触过的类型,但是,对于杨辉三角,想必我们很熟悉它的返回值吧!!一定是一个二维数组吧!!因此:List<List<Integer>>我们也可以看出是一个二维数组!!因此,我们有着一下的使用:
//定义一个二维数组
List<List<Integer>> ret = new ArrayList<>();
//定义一维数组
List<Integer> row = new ArrayList<>();
有了上述的代码,那么,我们就可以进行总体代码的书写了!
public static List<List<Integer>> generate(int numRows) {
//定义一个二维数组
List<List<Integer>> ret = new ArrayList<>();
//定义一维数组
List<Integer> row = new ArrayList<>();
//确定好第一行的1,并且将1放入到ret中
row.add(1);
ret.add(row);
//中间位置curRow的赋值
for (int i = 1; i < numRows; i++) {
//获取到前一行的元素
List<Integer> prevRow = ret.get(i-1);//前一行
List<Integer> curRow = new ArrayList<>();
curRow.add(1);//第一个1
//中间curRow list的赋值
for (int j = 1; j < i; j++) {
int x = prevRow.get(j)+prevRow.get(j-1);
curRow.add(x);
}
//添加最后的1 ,并且放入到ret中!
curRow.add(1);//最后一个1
ret.add(curRow);
}
return ret;
}
那么,我们来深入研究一下上述的代码:
对于第二行的元素:
对于第三行往后的元素……
上面便是笔者进行写代码的主要思路!!有意者请多多欣赏!!
面试编程题:删除字符
要求删除s1中的字符,这些字符都是s2中出现的!
s1 = "welcome to leetcode" , s2 = "come";
最后得到的为:s1="wl t ltd"
那么请看笔者的代码:
public static void main(String[] args) {
ArrayList<Character> list = new ArrayList<>();
String s1 = "welcome to leetcode";
String s2 = "come";
for (int i = 0; i < s1.length(); i++) {
//获取单个元素
char ch = s1.charAt(i);
if (!s2.contains(ch+"")){
list.add(ch);
}
}
//打印
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}
}
上述代码的运行结果为:
本次数据结构练习题到此结束!!