chili 默默学编程

Free Code Camp(二):JS 初级算法题


本文目录:

  • 字符串反转(reverse a string);
  • 阶乘(factorialize a number);
  • 检查回文(check for palindromes)(注意删除所有标点和空格);
  • 找出字符串中最长单词(find the longest word in a string);
  • 句子中每个单词首字母大写(title case a sentence);
  • 找出子数组中最大值的集合(return the largest number in arrays);
  • 判断字符串是否以特定的字符串结尾(confirm the ending);
  • 截断字符串,超出指定长度的部分用 “...” 替代(truncate a string);
  • 按指定长度分割数组(chunky monkey);
  • 按索引位置切割数组,若索引位置大于长度则返回空数组(slasher flick);
  • 比较字符串,蛤蟆吃队友,也可以吃对手,具体看问题描述(mutations);
  • 过滤数组假值(真假美猴王)(falsy bouncer);
  • 摧毁数组中指定的值(seek and destroy);
  • 数组排序并找出元素索引(where do I belong);
  • 凯撒密码(caesars cipher);

说明:

  1. 原题目没有答案,所有答案代码是我自己写的;
  2. 代码经过测试,满足题目要求,不过可能存在更优的答案;
  3. 代码里的缩进是 2 字符,并且语句末尾都带有分号,是因为原题目的编辑器设置的要求;

字符串反转(reverse a string)

- 题目描述:

reverseString("hello") 应该返回 "olleh".

reverseString("hello") 应该返回 "olleh".

- 代码:

function reverseString(str) {
  var arr = str.split('');
  arr.reverse();
  str = arr.join('');
  return str;
}

- 要点:

String.split()
Array.reverse()
Array.join()

- - - - - - - 

阶乘(factorialize a number)

- 题目描述: 

factorialize(5) 应该返回 120(即 5*4*3*2*1).

- 代码:

function factorialize(num) {
  var result = 1;
  for(i=0;i<num;i++){
    result *= (i +1);
  }
  return result;
}

- 要点:

 - - - - - - - 

检查回文(check for palindromes) 

- 题目描述(注意去掉多余的标点符号和空格): 

palindrome("eye") 应该返回 true.

palindrome("not a palindrome") 应该返回 false.

palindrome("A man, a plan, a canal. Panama") 应该返回 true.

- 代码: 

function palindrome(str) {
  str = str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g, '');
  str = str.toLowerCase();
  var result = false;
  var str1 = JSON.parse(JSON.stringify(str));
  str = str.split('').reverse().join('');
  if(str1 == str) {
    result = true;
  }
  return result;
}

- 要点: 

String.replace()
String.toLowerCase()

其中正则表达式,用来删除所有标点符号、空格。(应该有其他方法)

其中有一个深拷贝

- - - - - - - 

找出字符串中最长单词(find the longest word in a string)

- 题目描述: 

findLongestWord("The quick brown fox jumped over the lazy dog")

 应该返回 6.

- 代码: 

function findLongestWord(str) {
  var arr = str.split(' ');
  var result = 0;
  for(i=0;i<arr.length;i++) {
    var a = arr[i];
    if(a.length > result) {
      result = a.length;
    }
  }
  return result;
}

- 要点: 

String.split()
String.length

- - - - - - - 

句子每个单词首字母大写(title case a sentence)

- 题目描述: 

确保字符串的每个单词首字母都大写,其余部分小写。

- 代码: 

function titleCase(str) {
  str = str.toLowerCase();
  var arr = str.split(' ');
  for(i=0;i<arr.length;i++) {
    var a = arr[i];
    aarr = a.split('');
    aarr[0] = aarr[0].toUpperCase();
    arr[i] = aarr.join('');
  }
  str = arr.join(' ');
  return str;
}

- 要点: 

String.split()
String.toLowerCase()
String.toUpperCase()

- - - - - - - 

找出子数组中最大值的集合(return the largest number in arrays)

- 题目描述: 

largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]) 

应该返回 [27,5,39,1001].

- 代码: 

function largestOfFour(arr) {
  var max = function(arr1) {
    var result = arr1[0];
    for (var i = 0; i < arr1.length; i++) {
        if (result < arr1[i]) {
            result = arr1[i];
        }
    }
    return result;
  };
  var r = [];
  for (var i = 0; i < arr.length; i++) {
      var a = arr[i];
      r.push(max(a));
  }
  return r;
}

- 要点: 

- - - - - - - 

判断字符串是否以特定的字符串结尾(confirm the ending)

- 题目描述: 

confirmEnding("Bastian", "n") 应该返回 true.

confirmEnding("He has to give me a new name", "name") 应该返回 true.

- 代码: 

function confirmEnding(str, target) {
  var spl = str.substr(-target.length)
  return spl == target;
}

- 要点: 

String.substr()

- - - - - - - 

截断字符串,超出指定长度的部分用 “...” 替代(truncate a string)

- 题目描述: 

truncate("Peter Piper picked a peck of pickled peppers", 14) 

应该返回 "Peter Piper...".

(注意,一般情况下 “...” 三个字符也计入长度,若给定的长度小于 3 则 “...” 不计入长度)

- 代码: 

function truncate(str, num) {
  if (str.length <= num) {
      return str;
  } else if (num <= 3) {
      return str.slice(0, num) + '...';
  } else {
      return str.slice(0, num - 3) + '...';
  }
}

- 要点: 

String.slice()

- - - - - - - 

按指定长度分割数组(chunky monkey)

- 题目描述: 

chunk(["a", "b", "c", "d"], 2) 应该返回 [["a", "b"], ["c", "d"]]. 

 chunk([0, 1, 2, 3, 4, 5], 2) 应该返回 [[0, 1], [2, 3], [4, 5]]. 

 chunk([0, 1, 2, 3, 4, 5], 4) 应该返回 [[0, 1, 2, 3], [4, 5]].

- 代码: 

function chunk(arr, size) {
  if (arr.length <= size) {
      return [arr];
  } else {
      return [arr.slice(0, size)].concat(chunk(arr.slice(size), size));
  }
}

- 要点: 

Array.push()
Array.slice()
递归

- - - - - - - 

按索引位置切割数组,若索引位置大于长度则返回空数组(slasher flick)

- 题目描述: 

slasher([1, 2, 3], 2) 应该返回 [3].

 slasher([1, 2, 3], 0) 应该返回 [1, 2, 3]. 

 slasher([1, 2, 3], 9) 应该返回 [].

- 代码: 

function slasher(arr, howMany) {
  if (arr.length <= howMany) {
      return [];
  } else {
      return arr.slice(howMany);
  }
}

- 要点:

Array.slice()
Array.splice()

- - - - - - - 

比较字符串,蛤蟆吃队友,也可以吃对手(mutations)

- 题目描述: 

如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。

mutation(["zyxwvutsrqponmlkjihgfedcba", "qrstu"]) 应该返回 true. 

 mutation(["Mary", "Army"]) 应该返回 true.

注意:忽略大小写,忽略顺序

- 代码:

function mutation(arr) {
  var a1 = arr[0].toLowerCase();
  var a2 = arr[1].toLowerCase();
  for (var i = 0; i < a2.length; i++) {
      if(a1.indexOf(a2[i]) == -1) {
        return false;
      } 
  }
  return true;
}

- 要点:

Sting.indexOf()

- - - - - - - 

过滤数组假值 (真假美猴王)(falsy bouncer)

- 题目描述:

删除数组中的所有假值。

 在JavaScript中,假值有false、null、0、""、undefined 和 NaN。

bouncer([7, "ate", "", false, 9]) 应该返回 [7, "ate", 9]. 

 bouncer([false, null, 0, NaN, undefined, ""]) 应该返回 [].

- 代码: 

function bouncer(arr) {
  var deleteFake = function(val) {
      if (val == '') {
          return false;
      } else if (!val) {
          return false;
      } else {
          return true;
      }
  };
  
  return arr.filter(function(val){
      return deleteFake(val);
  });
}

- 要点:

Array.filter()
除 '' 外,其他假值的反值是 true

- - - - - - - 

摧毁数组中指定的值(seek and destroy)

- 题目描述:

 destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3) 应该返回 [1, 5, 1]. 

 destroyer([3, 5, 1, 2, 2], 2, 3, 5) 应该返回 [1].

- 代码: 

function destroyer(arr2) {
  var arr = arr2;
  var deleteNum = arguments;
  for (var i = 0; i < deleteNum.length; i++) {
      arr = arr.filter(function(val) {
          return val != deleteNum[i];
      });
  }
  return arr;
}

- 要点: 

Arguments object  // arguments 的使用
Array.filter()

- - - - - - - 

数组排序并找出元素索引(where do I belong)

- 题目描述: 

先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。 

举例:where([1,2,3,4], 1.5) 应该返回 1。因为1.5插入到数组[1,2,3,4]后变成[1,1.5,2,3,4],而1.5对应的索引值就是1。

注意 out of range 的情况。

- 代码: 

function where(arr, num) {
  arr.sort(function(a, b) {
    return a - b;
  });
  for (var i = 0; i < arr.length; i++) {
      if (arr[i] >= num) {
          return i ;
      }
  }
  return arr.length;
}

- 要点:

Array.sort()

 - - - - - - - 

凯撒密码(caesars cipher)

- 题目描述: 

凯撒密码Caesar cipher,又叫移位密码。

移位密码也就是密码中的字母会按照指定的数量来做移位。 

一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。

rot13("SERR PBQR PNZC") 应该解码为 "FREE CODE CAMP" 

 rot13("SERR CVMMN!") 应该解码为 "FREE PIZZA!"

注意 out of range 的情况。

- 代码: 

function rot13(str) { // LBH QVQ VG!
  var shift = 13;
  var result = '';
  var max = 'Z'.charCodeAt(0);
  var min = 'A'.charCodeAt(0);
  for (var i = 0; i < str.length; i++) {
      var a = str[i];
      var index = a.charCodeAt(0);
      if (index >= min && index <= max) {
        result += String.fromCharCode((index + shift - min) % 26 + min);
    } else {
        result += a;
    }
  }
  return result;
}

- 要点: 

String.charCodeAt()
String.fromCharCode()

- - - - - - - 

(完)


reply ( 5 )

winshu@2018-09-17 17:05:23

博客可以引入highlight.js对代码段进行高光

xiaokong@2018-09-17 20:08:13

@winshu,OK,谢谢

xiaokong@2018-09-17 21:02:43

额,高亮的部分怎么乱七八糟的。。

xiaokong@2018-09-17 21:11:58

编辑器做的标记,跟,highlight.js 读取的标记不一致。我再修一修。

xiaokong@2018-09-17 23:06:32

ok