本文已参与「新人创作礼」活动,一起开启掘金创作之路。
剑指 Offer 03. 数组中重复的数字
结果
执行结果:通过显示详情 执行用时:1 ms ,在所有Java提交中击败了79.80%的用户 内存消耗:48.9 MB ,在所有Java提交中击败了66.66%的用户 通j过测试用例:27/27
花费
10分钟左右,没有编码难度。
思路
最开始想的是存数字,每次读一个数字再和存的数字做匹配,很垃圾。
-
思路1
使用一个同样size的数组,按索引存储,存了表示1,没存表示0,输出第一个访问了存1的下标
-
思路2
使用set动态保存
思路一1效果更好
code1 这里是运用了思路一的实现代码,数组具有快速索引的特性,所以使用下标来代表数字,索引时就知道这个数字是否重复了。 但是这也有一个缺点,就是会生成一个和输入等长的数组,这样比较浪费空间,理想状态下是动态的数组,按需要生成就更好。
public int findRepeatNumber(int[] nums) {
/**
* 思路1,使用一个同样size的数组,按索引存储,存了表示1,没存表示0,输出第一个访问了存1的下标
*/
int[] re = new int[nums.length];
// for (int i : re){
// System.out.print(i+"\t");
// }
for (int num : nums) {
if (re[num] == 1) {
return num;
} else {
re[num] = 1;
}
}
return -1;
}
code2 这是实现思路二的实现代码。主要用到了set的元素唯一性的特点。hashset的add方法,如果添加成功,则返回ture,所以可以根据这个来判断数据是否重复。但实际上这个方法不如上面的好,占用内存更大而且运行也更慢。
public int findRepeatNumber1(int[] nums) {
/**
* 思路2,使用set动态保存
*/
HashSet<Integer> hs = new HashSet<>();
for (int num : nums) {
boolean re = hs.add(num);
if (!re) {
return num;
}
}
return -1;
}