题目:
构造一个特定数组,构造规则:给定一个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 方法能对排序好的数组进行二分查找法操作。
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刷题这个功能真的很好用,但是要利用好,不能太过于依赖,要将其当作工具。