数组动态添加元素问题 | 豆包MarsCode AI 刷题

68 阅读4分钟

题目:

构造一个特定数组,构造规则:给定一个n,对于每个i从1到n,将数字n到i逆序拼接,直到i到n为止,最终,输出这个拼接后的数组,例如,当n=3时,拼接后的数组是[3,2,1,3,2,3]

个人解题思路:

题目要求根据构造规则实现动态的向数组中添加元素,而java中数组的长度是固定的,要想实现题目的要求,有两种方法:

第一种:使用ArrayList,因为ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。在使用时,要先向ArrayList中添加元素,然后将其转换为int数组;较为复杂

第二种:获取结果数组的长度,然后动态的向其添加元素

相关知识点:

Java ArrayList

ArrayList 类似于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.ArrayList; // 引入 ArrayList 类

ArrayList<E> objectName =new ArrayList<>();  // 初始化
  • E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型(Integer  Long  Boolean Byte  Character  Double  Float   Short)。
  • objectName: 对象名。

ArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。

添加元素:add()方法

示例:

    ArrayList<String> name = new ArrayList<>();
    name.add("Dathline");
    name.add("Mary");

访问元素:get()方法

示例:

name.get(0);//索引值从0开始

修改元素:set()方法

set(int index, E element) 方法的第一个参数是索引(index),表示要替换的元素的位置,第二个参数是新元素(element),表示要设置的新值:

示例:

name.set(1"Doris"); // 第一个参数为索引位置,第二个为要修改的值        

删除元素:remove()方法

示例:

sites.remove(1); // 删除第二个元素  

计算大小:size()方法

示例:

 System.out.println(name.size());  

迭代数组列表

我们可以使用 for 来迭代数组列表中的元素:

ArrayList<String> sites = new ArrayList<String>();  
        sites.add("Google");  
        sites.add("Runoob");  
        sites.add("Taobao");  
        sites.add("Weibo");  
        for (int i = 0; i < sites.size(); i++) {  
            System.out.println(sites.get(i));  
        }  

也可以使用 for-each 来迭代元素:

实例

for (String i : sites) {  
   System.out.println(i);  
}  

数组

声明数组变量:有两种方法:

dataType[] arrayRefVar; // 首选的方法

dataType arrayRefVar[]; // 效果相同,但不是首选方法

Arrays 类

java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。

具有以下功能:

  • 给数组赋值:通过 fill 方法。
  • 对数组排序:通过 sort 方法,按升序。
  • 比较数组:通过 equals 方法比较数组中元素值是否相等。
  • 查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

image.png

Java代码实现:

方法一:

import java.util.Arrays;
import java.util.ArrayList;

public class Main {
    public static int[] solution(int n) {
        // write code here
        //创建新的ArrayList来存储
        ArrayList<Integer> resultList = new ArrayList<>();
        // 使用for循环获得要添加的元素,并将其添加到arrayList中
        for (int i = 1; i <= n; i++) {
        for (int j = n; j >= i; j--) {
        resultList.add(j);
        }
        }
        // 将arrayList转换为整型数组
        int[] resultArray = new int[resultList.size()];
        for (int k = 0; k < resultList.size(); k++) {
        resultArray[k] = resultList.get(k);
        }
        return resultArray;
        }
       
    public static void main(String[] args) {
        System.out.println(Arrays.equals(solution(3), new int[] { 3, 2, 1, 3, 2, 3
        }));
        System.out.println(Arrays.equals(solution(4), new int[] { 4, 3, 2, 1, 4, 3,
                2, 4, 3, 4 }));
        System.out.println(Arrays.equals(solution(5), new int[] { 5, 4, 3, 2, 1, 5,
                4, 3, 2, 5, 4, 3, 5, 4, 5 }));
        // System.out.println(Arrays.toString(solution(3)));
    }
}

方法二:

import java.util.Arrays;
import java.util.ArrayList;

public class Main {
    public static int[] solution(int n) {
        // write code here
        //获取数组长度
        int length = n * (n + 1) / 2;
        int[] resultArray = new int[length];
        int index = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = n; j >= i; j--) {
                resultArray[index++] = j;
            }
        }
        return resultArray;
    }

    public static void main(String[] args) {
        System.out.println(Arrays.equals(solution(3), new int[] { 3, 2, 1, 3, 2, 3
        }));
        System.out.println(Arrays.equals(solution(4), new int[] { 4, 3, 2, 1, 4, 3,
                2, 4, 3, 4 }));
        System.out.println(Arrays.equals(solution(5), new int[] { 5, 4, 3, 2, 1, 5,
                4, 3, 2, 5, 4, 3, 5, 4, 5 }));
        // System.out.println(Arrays.toString(solution(3)));
    }
}

在解题时遇到的问题: 在第一次读到题目时,疑惑i到底代表的是什么?是拼接的次数,还是什么,再仔细读,明白了:i 并不直接表示拼接的次数,而是表示当前正在处理的数字。具体来说,i 从 1 到 n 遍历,每次遍历都会生成一个从 n 到 i 的逆序序列,并将这些序列拼接在一起。

个人刷题方法分享:

在拿到一个题目时,千万不要直接去问小助手解题思路和代码思路,一定是得自己先思考,确定大致的解题思路,然后构思代码要怎样实现,再根据自己的理解给出代码,进行运行,看是否报错,如果有错误,先尝试自己解决,解决不了的再问小助手; 在完成题目之后,可以询问AI小助手解题思路,将他的思路和自己的思路进行对比,吸收精华之处,在遇到不懂的知识点,一定要及时的查找资料。 如果刚开始想了很久还是没有解题思路,可以询问小助手如何解题,无论哪种方式,都得掌握解题的方法,不能只是为了完成任务而将代码复制上去。 总之,AI刷题这个功能真的很好用,但是要利用好,不能太过于依赖,要将其当作工具。