FreeCodeCamp 算法题 2

栏目: 编程工具 · 发布时间: 5年前

内容简介:思路:结合我们之前那个找出最长单词然后我们可以利用

思路:

  • 基本就是之前找出单词最长的,并返回
  • 只是这个题,不止找出一个数组的最大值,而是找出多个数组的最大值并组成一个数组,这时候用 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/…

博客: singsing.io/blog/fcc/ba…

思路:

  • 它要比较的是 str 最后的部分和 target 的部分
  • 我们能不能从 str 后面截取跟 target 一样长的字符串
  • 我记得 slice() 是可以反向截取的,例如 取数组最后一个元素: Array.slice(-1)
// 初次解法
function confirmEnding(str, target) {
  return target === str.slice(-target.length);
}

confirmEnding("Bastian", "n");
复制代码

上面的是反向截取,如果我们要正向截取呢,那我们要知道从第几位开始。 str.lengthtarget.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/…

博客: singsing.io/blog/fcc/ba…

思路一:

  • 我利用 Array(num) 去创建一个数组,该数组中有 num 项
  • Array.fill() 去填充字符串
  • Array.join() 去拼接
  • 判断 num 是否小于 0,是的话直接返回空串,注意不能判断是否为真,因为 Number => Boolean 中只有 +0, -0false
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/…

博客: singsing.io/blog/fcc/ba…

题目要求:

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/…

博客: singsing.io/blog/fcc/ba…

题目要求:

  • 把一个数组 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/…

博客: singsing.io/blog/fcc/ba…

题目要求:返回一个数组被截断 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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

如何不在网上虚度人生

如何不在网上虚度人生

[美] 肯尼思·戈德史密斯 / 刘畅 / 北京联合出版公司 / 2017-9 / 39.80元

我们平时上网多大程度上是浪费时间,多大程度是在学习、关心社会、激发创造力?我们真能彻底断网,逃离社交网络吗? 手机把都市人变成一群电子僵尸,是福是祸? 浏览记录就是我们将来的回忆录吗?文件归档属于一种现代民间艺术? 不自拍、P图、发朋友圈,我还是我吗? 美国知名概念艺术家戈德史密斯认为:上网绝不是浪费时间,而是一种创造性的活动。在本书中他以跨学科角度、散文式语言进行论证,涉及大众传播学、计算......一起来看看 《如何不在网上虚度人生》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具