FreeCodeCamp 算法题 2

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

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

思路:

  • 基本就是之前找出单词最长的,并返回
  • 只是这个题,不止找出一个数组的最大值,而是找出多个数组的最大值并组成一个数组,这时候用 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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

Coding the Matrix

Coding the Matrix

Philip N. Klein / Newtonian Press / 2013-7-26 / $35.00

An engaging introduction to vectors and matrices and the algorithms that operate on them, intended for the student who knows how to program. Mathematical concepts and computational problems are motiva......一起来看看 《Coding the Matrix》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具