数据结构训练营4

简介: 数据结构训练营4

566. 重塑矩阵

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。


给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。


重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。


如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

f432f023c05e51ea71fdab312d8c4e44.jpeg


输入:mat = [[1,2],[3,4]], r = 1, c = 4


输出:[[1,2,3,4]]


试列2:

344349beaa048426f118f1d5ffc4037f.jpeg


输入: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的二维数组中,每一行每一列,如何去求出来??这个在一开始就难道了我!!但是,身为青少年好好学习的我!怎能被打到??于是,用了一个函数,这个复杂的问题,就被聪明的我解决了!!


下面请看笔者的代码:如何来求出二维数组的行数,列数的!


<code class="language-plaintext hljs">    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);
    }
</code>

经过上述的代码的使用,那么请看代码的运行结果:


0a2653c851af460fa595bd959398a8f1.png

我们根据上述代码的一一对比,就可以看出来最后如何在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 行。


在「杨辉三角」中,每个数是它左上方和右上方的数的和。

a75a187cd3b7897bbd630aa3a35455ea.gif


示例 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;
    }


那么,我们来深入研究一下上述的代码:


0a2653c851af460fa595bd959398a8f1.png

对于第二行的元素:

2d65d23f6d4748949b924e4057485923.png


对于第三行往后的元素……


6de278e6d6694ce5bb08e7e842b7e74b.png

上面便是笔者进行写代码的主要思路!!有意者请多多欣赏!!


面试编程题:删除字符

要求删除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));
        }
    }


上述代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


本次数据结构练习题到此结束!!


相关文章
|
算法 Java C语言
数据结构训练营5
数据结构训练营5
91 0
数据结构训练营5
|
存储 算法
数据结构刷题训练营3
数据结构刷题训练营3
85 0
数据结构刷题训练营3
|
存储 算法 C语言
数据结构刷题训练营2
数据结构刷题训练营2
73 0
数据结构刷题训练营2
|
存储 Java
数据结构刷题训练营1
数据结构刷题训练营1
73 0
数据结构刷题训练营1
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
215 9
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
37 1
|
28天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
54 5
|
1月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
1月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
1月前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
52 4

热门文章

最新文章