人生苦短,总要写点东西留下足迹。
求素数
写一个函数,要求参数是一个1000000以内的整数,并判断这个整数是不是素数。注意代码执行效率不超过32ms
答:这题应该不算难,大家在学校里经常写吧。
function prime(a) {
console.time("运行时间");
let isPrime = true;
let b = Math.pow(a, 0.5);
for (let index = 2; index <= b; index++) {
if (a % index === 0) {
isPrime = false;
console.log("是素数");
console.timeEnd("运行时间");
return null;
}
}
if (isPrime) {
console.log("是素数");
}
console.timeEnd("运行时间");
}
prime(987631);
问:这个循环多少次?
答:不超过1000次
问:怎么让循环次数不少于500次?
答:踢出去偶数,代码如下
function prime(a) {
console.time("运行时间");
if (a === 2) {
console.log("是素数");
console.timeEnd("运行时间");
return null;
}
let isPrime = true;
let b = Math.pow(a, 0.5);
for (let index = 3; index <= b; index += 2) {
if (a % index === 0) {
isPrime = false;
console.log("不是素数");
console.timeEnd("运行时间");
return null;
}
}
if (isPrime) {
console.log("是素数");
console.timeEnd("运行时间");
}
}
prime(999983);
求交集
有两个数组:let arr1 = [1,2,3,4,5] , arr2 = [3,5,7,8,9]。使用一行代码实现:得到一个新的数组,里面只包含两个数组都有的元素。
答:[...new Set([...a, ...b])]
问:貌似有些不对,这好像是并集......
答:let arr = arr1.filter((a) => arr2.find((b) => b === a));在arr1里过滤出arr1与arr2共有的元素。
问:看似没得问题。 arr1 arr2 都含有0 会怎样?
答:求出来的交集没有0,原因,find返回的是元素的值。find 0 的时候,filter返回值0,是false。难不倒我。
arr1.filter((a) => arr2.find((b) => b === a) === undefined ? false : true);
确实ok了,但感觉怪怪的。看最终版吧。
arr1.filter(a => arr2.includes(a));
是时候复习功课了,红红火火恍恍惚惚哈哈哈哈哈哈。
找只出现一次的元素
有数组 let arr = [1,2,1,3,1,2,2,2,4];要求:得到一个新数组,里面只包含在arr中只出现一次的元素,比如:[3,4]。只允许一行。
答:思考半天,整出来下面这个
arr.filter(
(item) =>
!arr.reduce((count, cur) => {
return (count = item === cur ? count + 1 : count);
}, -1)
)
还有下面这个
arr.filter(
(item, item_index) =>
!arr.find((a, a_index) => a === item && a_index !== item_index)
)
问:整的太复杂了,给提示:下面这三个怎么写。数组里偶数的集合? 数组里偶数的个数? 数组里偶数个数是否大于3?
答:这我会呀!可这个跟这个题怎么联系啊?这怎么写? 统计元素次数就得另外来一个数组,再统计,一行搞不定呀。。。
console.log(arr.filter((item) => item % 2 === 0));
console.log(arr.filter((item) => item % 2 === 0).length);
console.log(arr.filter((item) => item % 2 === 0).length > 3);
哦!这样!两个filter加一起。
arr.filter((a) => arr.filter((item) => item === a).length === 1)
统计次数转成对象
统计上题数组arr中每种数字出现的次数。结果示例:{ "1":2,"2":4 ,"3":1,"4":1}。
答:简单,前两天刚写过
arr.forEach((item) => (o[item] = o.hasOwnProperty(item) ? o[item] + 1 : 1));
问:用reduce怎么写? ||运算符怎么用?
答:想一哈,有了!
let o = {};
arr.reduce((pre, cur) => {
o[cur] || (o[cur] = pre);
o[cur]++;
return pre;
}, 0);
问:为什么不把reduce第二个参数整成{}
答:我又可以了
console.log(
arr.reduce((o, cur) => {
o[cur] || (o[cur] = 0);
o[cur]++;
return o;
}, {})
);
问:化简到一行怎么整?o[cur]=...? 逗号运算符了解吗?
答:
console.log(
arr.reduce((o, cur) => {
o[cur] = (o[cur] || 0) + 1;
return o;
}, {})
);
console.log(arr.reduce((o, cur) => ((o[cur] = (o[cur] || 0) + 1), o), {}));
//JS真的是一门奇妙的语言啊
奔跑吧,兔子!
在一个神话故事中,有一只小兔子住在一个周长1千米的神湖旁,A、B两点把这个神湖分成两等份(如图).已知小兔子从B点出发,沿着逆时针方向绕神湖做跳跃运动,它每跳 3 8 千米休息一次,如果它跳到A点正好休息,那么就会经过特别通道AB滑到B点,从B点继续跳.它每经过一次特别通道,神湖的半径就扩大一倍.现在已知小兔子共休息了1000次,这时神湖的周长是多少千米?
let step = 375;
let place = 0;
let p = 1000;
// 半径 穿越
for (let i = 1; i <= 1000; i++) {
let isPass = false;
place += step;
if (place % p === p / 2) {
place = 0;
p = 2 * p;
isPass = true;
}
console.log(place, p, isPass);
}
总结
在学校里遇见的题目确实需要逻辑哈。完结。