作为训练题中的第一题,刚开始看觉得简单,仔细一琢磨。这道简单的题目里透露出的是狡猾。
其他简单题目也一样,你也许需要考虑侧重的点在哪里?简单的题目考你的可能不是代码能力,而是沟通,变通,或者理解。
- 最简单
- 更节约时间
- 更节约空间
- 其他要求
1、最最最简单的解答就是既不考虑时间也不考虑空间的暴力求解
双循环
class Solution {
public int findRepeatNumber(int[] nums) {
int n=nums.length;
for(int i=0;i<n;i++){
for (int j=i+1;j<n;j++){
if(nums[i]==nums[j]){
return nums[i];
}
}
}
return -1;
}
}
2、考虑时间,但是不考虑空间
用数组
class Solution {
public int findRepeatNumber(int[] nums) {
int[] a=new int[nums.length];
for(int i=0;i<nums.length;i++){
if(a[nums[i]]==1){
return nums[i];
}
a[nums[i]]=1;
}
return -1;
}
}
3、考虑空间,但不考虑时间
用哈希
class Solution {
public int findRepeatNumber(int[] nums) {
Map<Integer, Integer> hs = new HashMap<>();
for(int num : nums){
if(hs.containsKey(num)){
return num;
}
hs.put(num, 0);
}
return -1;
}
}
4、其他方法
(1)原地交换
class Solution {
public int findRepeatNumber(int[] nums) {
int n=nums.length;
int t;
for(int i=0;i<n;){
if(i!=nums[i]){
if(nums[nums[i]]==nums[i]){
return nums[i];
}else{
t=nums[nums[i]];
nums[nums[i]]=nums[i];
nums[i]=t;
}
}
else{
i++;
}
}
return -1;
}
}