描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
输入:[2,3,1,0,2,5,3] 返回值: 2
说明: 2或3都是对的
思路: 新建空数组,循环题目数组,如果空数组对应的值还没有,则置为1,若有,则直接返回该值。由于本题输出任何一个重复的数组都可以,所以,这里输出的是第一个重复的值,相对简单。
写法两种,但思路完全相同
function duplicate( numbers ) {
// write code here
let arr=[];
for(let i=0;i<numbers.length;i++){
if(!arr[numbers[i]]){
arr[numbers[i]]=1;
}else{
return numbers[i];
}
}
return -1;
}
function duplicate( numbers ) {
// write code here
let arr=[];
for(let i=0;i<numbers.length;i++){
if(arr[numbers[i]]){
return numbers[i];
}else{
arr[numbers[i]]=1;
}
}
return -1;
}
总结:本题所用知识点:
1. 数组长度:arr.length
2. if表达式判断规则
Boolean 表达式
一个值为 true 或者 false 的表达式。如果需要,非 Boolean 表达式也可以被转换为 Boolean 值,但是要遵循下列规则:
- 所有的对象都被当作 true。
- 当且仅当字符串为空时,该字符串被当作 false。
- null 和 undefined 被当作 false。
- 当且仅当数字为零时,该数字被当作 false。
本题扩展:如果是输出全部重复值?如果是输出最后一个重复值?
如果是输出最后一个重复值,只需将循环条件倒置即可
for(let i=numbers.length-1;i>=0;i--)
如果是输出全部重复值,需要进行特殊情况处理
思路:新建一个res数组,遇见重复值,就向里推
//输出全部重复值
function duplicate( numbers ) {
// write code here
if(numbers.length<=0) return -1
let arr=[];
let res=[];
for(let i=0;i<numbers.length;i++){
if(arr[numbers[i]]){
res.push(numbers[i]);
}else{
arr[numbers[i]]=1;
}
}
if(res.length===0) return -1;
else return res;
}
console.log(duplicate([3,2,1,0,3,5,2]))
//console.log(duplicate([1,2,3,4,5,6]))
本扩展题的知识点:
1. Array对象的push()方法
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
arrayObject.push(newelement1,newelement2,....,newelementX)
参数说明:
newelement1 必需。要添加到数组的第一个元素。
newelement2 可选。要添加到数组的第二个元素。
newelementX 可选。可添加多个元素。
返回值
把指定的值添加到数组后的新长度。
说明
push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组。push() 方法和 pop() 方法使用数组提供的先进后出栈的功能。