• 数组经典练习题,超配合教程的练习(四)


    目录

    二维数组 

    1. 从定义形式上看  int[][] 2, 可以这样理解,原来的一维数组的每个元素是一维数组,就构成二维数组

    练习:请用二维数组输出一下图形

     二维数组的细节和注意事项:

    使用方式1: 动态初始化

    二维数组的内存分析图:(非常重要)

    使用方式2: 动态初始化

     使用方式3: 动态初始化--列数不确定

    练习:看一个需求:动态创建下面的二维数组,并输出

     使用方式4: 静态初始化

    练习:二维数组 的应用案例  :杨辉三角

    练习1:判断

            练习2:判断

    int[] x,y[];//下面能通过编译的是说明:x是int 类型的一维数组,y是int 类型的二维数组

    练习3:

    已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序,比如:* 【10, 12,45,90】,添加23后,数组为【10,12,23,45,90】

    画图分析(内存分析法):

            练习4:

    随机生成10个整数(1-100的范围)保存到数组;并倒序打印以及求平均值、求最大值和最大值的下标;并查找里面是否有8;


    二维数组 


    1. 从定义形式上看  int[][]
     2, 可以这样理解,原来的一维数组的每个元素是一维数组,就构成二维数组

    练习:请用二维数组输出一下图形

     思路分析:

    1. arr.length 表示二维数组的每个元素

    2. 使用for循环遍历二维数组的每个元素(数组)

    3. arr[ i ] 表示二维数组 的第 i+1个元素 ,比如 arr[ 0 ] :二维数组 的第一个元素

    4.arr [ i ].length 得到对应的每个一维数组的长度

    代码实现:

    1. //输出二维图形
    2. for (int i=0;i< arr.length;i++){//遍历二维数组的每个元素
    3. //遍历二维数组的每个元素(数组)
    4. //老韩解读:
    5. //1. arr[i] 表示二维数组的第i+1个元素,比如arr[0]:二维数组的第一个元素
    6. //2. arr[i].length 得到对应的每个一维数组的长度
    7. for (int j=0;j< arr[i].length;j++){
    8. System.out.print(arr[i][j]+"");//输出了一维数组。[i]表示第几个一维数组,[j]
    9. 表示第几个一维数组的第几个值
    10. }
    11. System.out.println();//换行
    12. }

    结果:

     二维数组的细节和注意事项:

    使用方式1: 动态初始化

    1. 语法:类型【】【】  数组名=new 类型【大小】【大小】
    2. 比如:int a[][]=new int[2][3]

    下面是使用演示:

    1. int arr[][] = new int[2][3];
    2. arr[1][1]=8;
    3. //遍历arr数组
    4. for (int i=0;i
    5. for (int j=0;j< arr[i].length;j++){
    6. System.out.print(arr[i][j]+"");
    7. }
    8. System.out.println();//换行
    9. }

    结果:

    下面使用内存分析图来分析上面的代码:

    二维数组的内存分析图:(非常重要)

     分析: 二维数组指向一个空间,但是这个空间并不直接存放数据,为什么不直接存放数据,因为这个空间里面存放的每个元素是一维数组,而不是具体的数据,所以它要追溯一维数组的引用存放的数据。

    使用方式2: 动态初始化

    1. 先声明:类型 数组名【】【】;
    2. 再定义(开辟空间) 数组名=new 类型【大小】【大小】
    3. 赋值(有默认值,比如int 类型的就是0)
     

     下面是使用演示(代码与“使用方式1”的一致,只是“先声明,再定义”):

    1. int arr[][];//声明二维数组
    2. arr=new int[2][3];//再开空间
    3. arr[1][1]=8;
    4. //遍历arr数组
    5. for (int i=0;i
    6. for (int j=0;j< arr[i].length;j++){
    7. System.out.print(arr[i][j]+"");
    8. }
    9. System.out.println();//换行
    10. }

    结果:

     使用方式3: 动态初始化--列数不确定

    练习:

    看一个需求:动态创建下面的二维数组,并输出

    代码实现:

    1. int[][] arr=new int[3][];//创建 二维数组 。一个有3个一维数组,但是每个一维数组还没有开数据空间
    2. for (int i=0;i//遍历arr每个一维数组
    3. //给每个一维数组开空间new
    4. //如果没有一维数组 new ,那么arr【i】 就是null
    5. arr[i]=new int[i+1];
    6. //遍历一维数组,并给一维数组的每个元素值
    7. for (int j=0;j< arr[i].length;j++){
    8. arr[i][j]=i+1;//赋值
    9. }
    10. }
    11. //遍历arr输出
    12. System.out.println("==========arr 元素=======");
    13. for (int i=0;i
    14. for (int j=0;j
    15. System.out.print(arr[i][j]+"");
    16. }
    17. System.out.println();
    18. }

    结果:

     使用方式4: 静态初始化

    1. 定义 类型 数组名[][]={{值1,值2……},{值1,值2……},{值1,值2……}}
    2. 使用即可【固定方向访问】
    3.  比如:int[][] arr ={{1,1,1},{8,8,9},{100}}  

    练习:

     代码实现:

    1. int arr[][]={{4,6},{1,4,5,7},{-2}};
    2. int sum=0;
    3. for (int i=0;i
    4. //遍历每个一维数组
    5. for (int j=0;j< arr[i].length;j++){
    6. sum+=arr[i][j];
    7. }
    8. }
    9. System.out.println("sum="+sum);

    结果:

    二维数组 的应用案例  :杨辉三角

      练习:杨辉三角 
    使用二维数组打印一个10行的
    *1
    * 1 1
    * 1 2 1
    * 1 3 3 1
    * 1 4 6 4 1
    * 1 5 10 10 5 1
    
    规律:
    * 1. 第一行有1个元素,第n行有n 个元素
    * 2。 第一行的第一个元素和最后一个元素都是1
    * 3. 从第三行开始,对于非第一个元素和最后的元素的值  arr[i][j]
    *    arr[i][j]=arr[i-1][j]+arr[i-1][j-1];

    代码实现:

    1. int[][] yanghui=new int[10][];
    2. //*上面一行的代码等价于int[] yanghui[]=new int[10][];
    3. for (int i=0;i//遍历yanghui的每个元素
    4. //给每个一维数组(行)开空间
    5. yanghui[i]=new int[i+1];
    6. //给每个一维数组(行)赋值
    7. for (int j=0;j
    8. //每一行的第一个元素和最后一个元素都是1
    9. if (j==0||j==yanghui[i].length-1){
    10. yanghui[i][j]=1;
    11. }else {//中间的元素
    12. yanghui[i][j]=yanghui[i-1][j]+yanghui[i-1][j-1];
    13. }
    14. }
    15. }
    16. //输出杨辉三角
    17. for (int i=0;i
    18. for (int j=0;j//遍历输出该行
    19. System.out.print(yanghui[i][j]+"\t");
    20. }
    21. System.out.println();//换行
    22. }

    结果: 


    练习1:判断

    String[] strs=new String{"a","b","c"};//数组定义错误
    String strs[]=new String[]{"a","b","c"};//数组定义正确
    String[] strs=new String[3]{"a","b","c"};//数组定义错误,String[3]不允许有数字

    练习2:判断

    int[] x,y[];//下面能通过编译的是
    说明:x是int 类型的一维数组,y是int 类型的二维数组

    x[0]=y;  报错int[][]->int

    y[0]=x;  正确  int[]->int[]

    y[0][0]=x;  报错 int[]->int

    x[0][0]=y;   错误  x[][]写法

    y[0][0]=x[0];  正确  int-> int

    x=y;  报错 int[][]->int


    练习3:

    已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序,比如:
    * 【10, 12,45,90】,添加23后,数组为【10,12,23,45,90】

    思路  本质数组扩容+定位
    * 1. 我们先确定  添加数应该插入到哪个索引
    * 2, 然后扩容
    遍历arr 数组,如果发现 insertNum=23< arr[i],说明 i 就是要插入的位置,就使用 index 保留index=i;
    如果遍历完后,没有发现  insertNum=23< arr[i],说明 index=arr。length
    即: 添加到arr 的最后
    

    代码实现:

    1. int[] arr={10,12,45,90};
    2. int insertNum=23;
    3. int index=-1;//index 就是要插入的位置
    4. for (int i=0;i< arr.length;i++){
    5. if (insertNum<=arr[i]){
    6. index=i;
    7. break;//找到位置后,就退出
    8. }
    9. }
    10. //判断index 的值
    11. if (index==-1){//说明没有,还没有找到位置
    12. index= arr.length;
    13. }
    14. //扩容
    15. //先创建一个新的数组,大小arr。length+1
    16. int[] arrNew=new int[arr.length+1];
    17. //下面老师准备将arr的元素拷贝到arrNew ,并且要跳过index位置
    18. //分析:
    19. // int[] arr +{10,12,45,,90}
    20. //arrNew={ }
    21. for (int i=0,j=0;i< arrNew.length;i++){
    22. if (i!=index){//说明可以把arr元素拷贝到arrNew
    23. arrNew[i]=arr[j];
    24. j++;
    25. }else {//这个位置就是要插入是数
    26. arrNew[i]=insertNum;
    27. }
    28. }
    29. //让arr指向arrNew ,原来的数组 ,就称为垃圾,被销毁
    30. arr=arrNew;
    31. System.out.println("=======插入后,arr数组的元素情况======");
    32. for (int i=0;i
    33. System.out.println(arr[i]+"\t");
    34. }

    画图分析(内存分析法):

    结果:

    练习4:

    随机生成10个整数(1-100的范围)保存到数组;
    并倒序打印以及求平均值、求最大值和最大值的下标;
    并查找里面是否有8;

    代码实现:

    1. int[] arr = new int[10];
    2. //(int)(Math。random()*100)+1生产 随机数1-100
    3. for (int i = 0; i < arr.length; i++) {
    4. arr[i] = (int) (Math.random() * 100) + 1;
    5. }
    6. System.out.println("======arr的元素情况============");
    7. for (int i = 0; i < arr.length; i++) {
    8. System.out.print(arr[i] + "\t");
    9. }
    10. //倒序打印
    11. System.out.println("======arr的元素情况(倒序)============");
    12. for (int i = arr.length - 1; i >= 0; i--) {
    13. System.out.print(arr[i] + "\t");
    14. }
    15. // 求平均值、求最大值和最大值的下标
    16. double sum = arr[0];
    17. int max = arr[0];
    18. int maxIndex = 0;
    19. for (int i = 1; i < arr.length; i++) {
    20. sum+=arr[1];//累积和
    21. if (max < arr[i]) {//说明max不是最大值,就变化
    22. max = arr[i];
    23. maxIndex = i;
    24. }
    25. }
    26. System.out.println("\nmax最大值="+max+"下标maxIndex="+maxIndex);
    27. System.out.println("\n平均值="+(sum/arr.length));
    28. //查找数组中是否有8=》使用顺序查找
    29. int findNum=8;
    30. int index=-1;//如果找到,就把下标记录到index
    31. for (int i=0;i
    32. if (findNum==arr[i] ){
    33. System.out.println("找到数"+findNum+"下标="+i);
    34. index=i;
    35. break;
    36. }
    37. }
    38. if (index==-1){
    39. System.out.println("没有找到数"+findNum);
    40. }

    结果:

  • 相关阅读:
    业务脚本pytest封装
    栈的顺序存储实现(C语言)(数据结构与算法)
    赴日开发工程师工作怎么找?
    ActiveReportsJS 3.1 VS ActiveReportsJS 3.0
    Hadoop MapReduce + Hadoop YARN
    GO并发编程基础- 如何使用channel
    redis笔记2
    小程序中如何查看指定会员的所有订单?
    14. happens-before模型
    leetcode 416. Partition Equal Subset Sum 分割等和子集(中等)
  • 原文地址:https://blog.csdn.net/m0_57448314/article/details/126897243