已知如下数组
编写一个程序将数组扁平化并去除重复部分数据,最终得到一个降序且不重复的数组
var arr = [[1, 2, 3, [5, [100, [101, [102]]]], [123]], [2, [1]], 10]
function foo(arr) {
let newArr = []
function bar(arr) {
arr.forEach(vl => {
Array.isArray(vl) ? bar(vl) : newArr.indexOf(vl) == -1 && newArr.push(vl)
});
}
bar(arr)
return newArr.sort((a, b) => b - a)
}
//
console.log('foo', foo(arr));
有30个小朋友,编号1~30,围成一圈依次报数1、2、3数到3的小朋友推出这个圈,然后下一个小朋友重新报数1、2、3,问最后剩下的小朋友编号是多少
约瑟夫问题
function Josephus(n, m) { //定义一个输出最后一个人下标的方法,两个参数 n表示总人数,m表示报的数
var arr = []; //定义一个空数组
for (var i = 0; i < n; i++) {
arr[i] = true; //建立一个可以有n元素的数组,用来模拟报数的总人数 数组中值为true的表示剩下的人,false表示出去的人
}
console.log('arr', arr);
var total = n,//剩下的的人数
index = 0,//数组的下标
count = 0; //从从0-m报的数的下标
//循环,直到剩下一个人
while (total > 1) {
if (arr[index] == true) {
count++; //如果数组中的值为true,那么从conut+1
if (count == m) { //判断报数的人的数是否为m,如果为m,
count = 0; // 那么重置count计数器
arr[index] = false; //报m的人出去,即将他的值改为false
total--; //将剩下的人数-1
}
}
index++; //下标+1
if (index == arr.length) { //如果到了最后一人,
index = 0; //重置下标为0
}
} //循环结束
//遍历整个数组
for (var i = 0; i < arr.length; i++) {
if (arr[i] == true) { //值为true的人就是剩下的最后一个人
return i + 1; //因为数组下标是从0开始的,而报数是从1开始的,所以剩下的那个人报的数为数组下标+1
}
}
return -1; //如果没有返回-1
}
console.log(Josephus(30, 3)); //调用Josephus()方法</span>