jsL*_*ner 2 javascript arrays for-loop
我正在尝试使用数组和数据结构构建逻辑.我正在尝试使用for循环实现逻辑
function getRepeatingNumber(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
return arr[i];
}
}
}
return undefined;
}
getRepeatingNumber([2, 3, 6, 5, 2]);
Run Code Online (Sandbox Code Playgroud)
上面的函数接受数组并返回数组中的重复项,所以在上面的例子中它将返回2.但是如果我有一个类似这样的数组arr [2,3,3,6,5,2] case它应该返回3但是因为外部循环有索引[0],它是2作为参考,它将返回2作为答案.
如何实现一个返回重复项的第一次出现的函数.
而不是j在后面 的部件中迭代i,迭代部件之前 i:
function getRepeatingNumber(arr){
for (var i = 1; i < arr.length; i++) {
for (var j = 0; j < i; j++) {
if (arr[i] === arr[j]) {
return arr[i];
}
}
}
}
console.log(getRepeatingNumber([2,3,3,6,5,2]));Run Code Online (Sandbox Code Playgroud)
请注意,return undefined不需要显式,这是默认行为.
你也可以indexOf用来缩短代码:
function getRepeatingNumber(arr){
for (var i = 1; i < arr.length; i++) {
if (arr.indexOf(arr[i]) < i) {
return arr[i];
}
}
}
console.log(getRepeatingNumber([2,3,3,6,5,2]));Run Code Online (Sandbox Code Playgroud)
您甚至可以决定使用find- undefined在没有匹配的情况下将返回(即在我们的情况下没有重复):
function getRepeatingNumber(arr){
return arr.find((a, i) => {
if (arr.indexOf(a) < i) {
return true;
}
});
}
console.log(getRepeatingNumber([2,3,3,6,5,2]));Run Code Online (Sandbox Code Playgroud)
如果对大型阵列执行此操作,那么拥有一个以线性时间复杂度运行的解决方案将变得非常重要.在这种情况下,a Set会很有用:
function getRepeatingNumber(arr){
var set = new Set;
return arr.find(a => {
if (set.has(a)) return true;
set.add(a);
});
}
console.log(getRepeatingNumber([2,3,3,6,5,2]));Run Code Online (Sandbox Code Playgroud)
如果你是函数和单行函数,那么:
const getRepeatingNumber = r=>(t=>r.find(a=>[t.has(a),t.add(a)][0]))(new Set);
console.log(getRepeatingNumber([2,3,3,6,5,2]));Run Code Online (Sandbox Code Playgroud)