内容简介:思路:结合我们之前那个找出最长单词然后我们可以利用
思路:
- 基本就是之前找出单词最长的,并返回
- 只是这个题,不止找出一个数组的最大值,而是找出多个数组的最大值并组成一个数组,这时候用 Array.map() 最合适
// 初次解法 function largestOfFour(arr) { return arr.map(item => Math.max(...item)); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); 复制代码
结合我们之前那个找出最长单词
- Math.max.apply(null, array)
- Array.sort((a, b) => b - a)[0]
// Math.max.apply(null, array) function largestOfFour(arr) { return arr.map(item => Math.max.apply(null, item)); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); // Array.sort((a, b) => b - a)[0] function largestOfFour(arr) { return arr.map(item => item.sort((a, b) => b - a)[0]); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); 复制代码
然后我们可以利用 Array.reduce()
去实现一个 Array.map()
所以也可以这样写:
// Array.reduce() 实现 Array.map() + Math.max() function largestOfFour(arr) { return arr.reduce((acc, val) => acc.concat(Math.max(...val)), []); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); // 为什么用的是 concat() 而不是 push() // 因为 concat() 返回的是一个数组,而 push() 返回的是 Array.length // 使用 push() 的话,我们要手动 return acc 值 // 像这样,不然的话会报错,push is not a function function largestOfFour(arr) { return arr.reduce((acc, val) => { acc.push(Math.max(...val)) return acc }, []); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); 复制代码
检查字符串结尾 (Confirm the Ending)
题目: www.freecodecamp.cn/challenges/…
思路:
- 它要比较的是 str 最后的部分和 target 的部分
- 我们能不能从 str 后面截取跟 target 一样长的字符串
-
我记得
slice()
是可以反向截取的,例如 取数组最后一个元素:Array.slice(-1)
// 初次解法 function confirmEnding(str, target) { return target === str.slice(-target.length); } confirmEnding("Bastian", "n"); 复制代码
上面的是反向截取,如果我们要正向截取呢,那我们要知道从第几位开始。 str.length
和 target.length
相减就 ok 了
比较 slice, substr, substring
-
str.slice(beginSlice[, endSlice])
截取字符串的一部分,返回作为一个新的字符串,不影响原字符串。beginSlice endSlice
-
str.substr(start[, length])
返回一个字符串中从指定位置开始到指定字符数的字符。-
start
默认为 0 ,当为负数时,会加上字符串长度。
-
-
str.substring(indexStart[, indexEnd])
- 如果 indexStart 等于 indexEnd,substring 返回一个空字符串。
- 如果省略 indexEnd,substring 提取字符一直到字符串末尾。
- 如果任一参数小于 0 或为 NaN,则被当作 0。
- 如果任一参数大于 stringName.length,则被当作 stringName.length。
- 如果 indexStart 大于 indexEnd,则 substring 的执行效果就像两个参数调换了一样。
// slice function confirmEnding(str, target) { return target === str.slice(str.length - target.length); } confirmEnding("Bastian", "n"); // substr function confirmEnding(str, target) { return target === str.substr(str.length - target.length); } confirmEnding("Bastian", "n"); // substring function confirmEnding(str, target) { return target === str.substr(str.length - target.length); } confirmEnding("Bastian", "n"); 复制代码
利用正则表达式,这个真没想过!
RegExp $ RegExp.test()
function confirmEnding(str, target) { return RegExp(`${target}$`).test(str) } confirmEnding("Bastian", "n"); 复制代码
重复输出字符串 (Repeat a string repeat a string)
题目: www.freecodecamp.cn/challenges/…
思路一:
-
我利用
Array(num)
去创建一个数组,该数组中有 num 项 -
Array.fill()
去填充字符串 -
Array.join()
去拼接 -
判断
num
是否小于 0,是的话直接返回空串,注意不能判断是否为真,因为Number => Boolean
中只有+0, -0
为false
function repeat(str, num) { if (num < 0) return '' return Array(num).fill(str).join('') } repeat("abc", 3); 复制代码
其实嘛,看了博客知道另外一种解法,感觉是我对 Array.join()
不熟悉的原因。 Array.join()
把数组的各项用分隔符隔开,拼接成字符串,不传参的话,默认是用逗号隔开。
- 如果是一个元素都为空的数组
- 这个数组又用某个字符串分隔开
- 是不是就得到一个重复多次的字符串
function repeat(str, num) { if (num < 0) return '' return Array(num + 1).join(str) // 注意:num + 1 } repeat("abc", 3); 复制代码
思路二:直接用 String.repeat
str.repeat(count)
:构造并返回一个新字符串,该字符串为指定数量的字符串的副本。
-
count
: [0, 正无穷],为 0 时,返回一个空串,非整数时,向下取整。
function repeat(str, num) { if (num < 0) return '' return str.repeat(num) } const repeat = (str, num) => num > 0 ? str.repeat(num) : '' repeat("abc", 3); 复制代码
截断字符串 (Truncate a string)
题目: www.freecodecamp.cn/challenges/…
题目要求:
num num
思路: 分不同情况,进行字符串截取和拼接
function truncate(str, num) { // num 小于等于3时 if (num < 4) { return str.slice(0, num) + '...'; } // num 大于字符串长度时 if (num >= str.length) return str; return str.slice(0, num - 3) + '...'; } truncate("A-tisket a-tasket A green and yellow basket", 11); 复制代码
使用三元运算符: a ? b : c
function truncate(str, num) { if (num < str.length) { return str.slice(0, num > 3 ? num - 3 : num) + '...' } return str } truncate("A-tisket a-tasket A green and yellow basket", 11) 复制代码
其中 slice
也可以换成 substr
, substring
猴子吃香蕉, 分割数组 (Chunky Monkey)
题目: www.freecodecamp.cn/challenges/…
题目要求:
-
把一个数组
arr
按照指定的数组大小size
分割成若干个数组块。 - chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];
解题思路:
-
我们需要分割数组,那么我们看一下数组有哪些方法可以分割
console.log(Array.prototype)
找到slice() splice()
-
分割完后,要放进数组,那么要用到:
push() concat()
-
那分割的过程呢,要用循环,因为不用一个个遍历,所以用的是
while
// 因为 splice() 会改变原数组的长度,所以可以直接判断数组长度 function chunk(arr, size) { var a = [] while(arr.length) { a.push(arr.splice(0, size)) } return a } chunk(["a", "b", "c", "d"], 2); // 因为 slice() 不会修改原数组长度,所以用变量 i 去计数 function chunk(arr, size) { var a = [] var i = 0 while(i < arr.length) { a.push(arr.slice(i, i + size)) i += size } return a } chunk(["a", "b", "c", "d"], 2); // 然后 push 和 concat 的区别就是返回值 // push 返回的是 arr.length // concat 返回的是 一个新数组 复制代码
截断数组 (Slasher Flick)
题目: www.freecodecamp.cn/challenges/…
题目要求:返回一个数组被截断 n 个元素后还剩余的元素,截断从索引 0 开始。
大概意思就是:给你一个数组,和一个数字 n ,然后你返回这个数组从 0 开始删除掉 n 个元素的数组。
立马就可以想到: splice()
, 换个思路想想,截取剩余部分的话,那可以有 slice
-
直接删掉数组的一部分
splice
// splice 解法 function slasher(arr, howMany) { // 请把你的代码写在这里 arr.splice(0, howMany) return arr } function slasher(arr, howMany) { // 去掉多余的 arr return arr.splice(0, howMany) && arr } slasher([1, 2, 3], 2); 复制代码
-
截取剩余部分的
slice
function slasher(arr, howMany) { return arr.slice(howMany) } slasher([1, 2, 3], 2); 复制代码
-
当然你也可以用
shift
循环 n 次,这样也可以从 0 开始删除部分数组
function slasher(arr, howMany) { for (let i = 0; i < howMany; i++) { arr.shift() } return arr } slasher([1, 2, 3], 2); 复制代码
以上所述就是小编给大家介绍的《FreeCodeCamp 算法题 2》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 通俗易懂--决策树算法、随机森林算法讲解(算法+案例)
- 限流算法之漏桶算法、令牌桶算法
- 什么是Paxos算法?Paxos算法是区块链核心算法之一
- 一文读懂对称加密算法、非对称加密算法和Hash算法
- 算法(六):图解贪婪算法
- 算法篇03:排序算法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序设计方法(中文版)
Matthias Fellisen / 黄林鹏、朱崇恺 / 人民邮电出版社 / 2003-12 / 49.00元
《程序设计方法》以Scheme语言为基础介绍计算和程序设计的一般理论和实践。《程序设计方法》由8个部分和7个独立的章节(第8、13、18、24、29、33、38章)组成。8个部分主要讨论程序设计,独立章节则介绍一些与程序设计和计算相关的话题。《程序设计方法》第1至第3部分介绍了基于数据驱动的程序设计基础。第4部分介绍了程序设计中的抽象问题。第5部分和第6部分是与递归及累积相关的内容。《程序设计方法......一起来看看 《程序设计方法(中文版)》 这本书的介绍吧!