Freecodecamp 算法题
1. Reverse a String
翻转字符串
先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。
你的结果必须得是一个字符串
当你完成不了挑战的时候,记得开大招'Read-Search-Ask'。
这是一些有帮助的资源:
思路:先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。
function reverseString(str) {
str = str.split('').reverse().join('');
return str;
}
reverseString("hello");
2. Factorialize a Number
如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积。
阶乘通常简写成 n!
例如: 5! = 1 * 2 * 3 * 4 * 5 = 120
- 方法一:
function factorialize(num) {
if (num <= 1) {
return 1;
}else {
return factorialize(num - 1) * num;
}
return num;
}
factorialize(10);
- 方法二
function factorialize(num) {
if(num<=1){return 1;}
var number=1;
let n;
for(n =1; n<num;n++){
number *= n+1
}
return number;
}
factorialize(5);
3. Check for Palindromes
检查回文字符串
如果给定的字符串是回文,返回true,反之,返回false。
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。
函数参数的值可以为"racecar","RaceCar"和"race CAR"。
function palindrome(str) {
var regex = /[^a-zA-Z0-9]/g;
var tmpStr = str.replace(regex,'').toLowerCase().split('');
if(tmpStr.join('')===tmpStr.reverse().join('')){
return true;
}else{
return false;
}
}
palindrome("eye");
4. Find the Longest Word in a String
找出最长单词
在句子中找出最长的单词,并返回它的长度。
函数的返回值应该是一个数字。
思路:: 利用数组sort()方法,sort()方法需要接受一个比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
- 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回一个大于 0 的值。
function findLongestWord(str) {
var result = str.split(' ');
result.sort(function(firstElement, secondElement){
return secondElement.length-firstElement.length;
});
return result[0].length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
5. Title Case a Sentence
句中单词首字母大写
确保字符串的每个单词首字母都大写,其余部分小写。
像'the'和'of'这样的连接符同理。
思路:使用split分离str,使用slice()是首字母大写
再就是toLowerCase()和toUpperCase()的用法,要搞清前两者和toLocaleLowerCase()、toLocaleUpperCase()的区别
function titleCase(str) {
var result = str.split(' ')
var newArray = [];
for(let i=0;i<result.length;i++){
var newStr=result[i].slice(0,1).toUpperCase() + result[i].slice(1).toLowerCase();
newArray.push(newStr);
}
return newArray.join(' ');
}
titleCase("I'm a little tea pot");
6. Return Largest Numbers in Arrays
找出多个数组中的最大数
右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。
思路:用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素。
function largestOfFour(arr) {
var newArr=[];
for(var i=0;i<arr.length;i++){
let max=0;
for(var j=0;j<arr[i].length;j++){
if(arr[i][j] > max) max=arr[i][j];
}
newArr.push(max);
}
return newArr;
}
largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]])
7. Confirm the Ending
检查字符串结尾
判断一个字符串(str)是否以指定的字符串(target)结尾。
如果是,返回true;如果不是,返回false。
function confirmEnding(str, target) {
var result;
str.substr(str.length-target.length,str.length)===target ? result= true : result = false;
return result;
}
confirmEnding("Bastian", "n");
8. Repeat a string repeat a string
重复输出字符串
重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。
思路:用concat在字符串后面重复字符串
function repeat(str, num) {
var result="";
if(num<=0) return "";
else {
for(let i=0;i<num;i++){
result=result.concat(str);
}
}
return result;
}
repeat("abc", 3);
9. Truncate a string
截断字符串
如果字符串的长度比指定的参数num长,
则把多余的部分用...来表示。
切记,插入到字符串尾部的三个点号也会计入字符串的长度。
但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。
function truncate(str, num) {
var string='';
if(num<str.length){
if(num<=3){
string = str.slice(0,num)+'...';
return string;
}else{
string = str.slice(0,num-3)+'...';
return string;
}
}
return str;
}
truncate("A-tisket a-tasket A green and yellow basket", 11);
10. Chunky Monkey
猴子吃香蕉, 分割数组
把一个数组arr按照指定的数组大小size分割成若干个数组块。
例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];
function chunk(arr, size) {
var newArr=[];
for(let i=0;i<arr.length;i+=size){
newArr.push(arr.slice(i,i+size))
}
return newArr;
}
chunk(["a", "b", "c", "d"], 3);
11. Slasher Flick
截断数组
返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。
方法一:(slice)
function slasher(arr, howMany) {
return arr.slice(howMany,arr.length);
}
slasher([1, 2, 3], 2);
方法二:(splice)
function slasher(arr, howMany) {
arr.splice(0,howMany);
return arr;
}
slasher([1, 2, 3], 2);
12. Mutations
比较字符串
(蛤蟆可以吃队友,也可以吃对手)
如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。
举例,["hello", "Hello"]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。
["hello", "hey"]应该返回false,因为字符串"hello"并不包含字符"y"。
["Alien", "line"]应该返回true,因为"line"中所有字符都可以在"Alien"找到。
function mutation(arr) {
var FirstVal=arr[0].toLowerCase();
var SecondVal = arr[1].toLowerCase();
for(var i in SecondVal){
if(FirstVal.indexOf(SecondVal[i])==-1){
return false;
}
}
return true;
}
mutation(["hello", "hey"]);
13. Falsy Bouncer
过滤数组假值
(真假美猴王)
删除数组中的所有假值。
在JavaScript中,假值有false、null、0、""、undefined 和 NaN。
function bouncer(arr) {
var newArr = arr.filter(function(e){
if(e){
return e;
}
});
return newArr;
}
bouncer([7, "ate", "", false, 9]);
14. Seek and Destroy
摧毁数组
实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。
思路:
摧毁函数destroyer(arr,argument1,argument2,argument3,...)
函数参数不确定,第一个参数为一个数组,其他参数为要摧毁的数。即目标输出的数组应该是第一个参数数组删除其他参数后的数组。
将从第二个参数开始的参数组成一个数组。然后用fitter()来将数组内的每个数和新的数组进行比对,返回不符合的。
function destroyer(arr) {
var arr_arg = arguments;
var newArr=[];
for(var i=1;i<arr_arg.length;i++){
newArr.push(arr_arg[i]);
}
arr = arr.filter(function(val){
return newArr.indexOf(val) == -1;
});
return arr;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
15. 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。
同理,where([20,3,5], 19) 应该返回 2。因为数组会先排序为 [3,5,20],19插入到数组[3,5,20]后变成[3,5,19,20],而19对应的索引值就是2。
function where(arr, num) {
arr.push(num);
arr.sort(function(a,b){
return a-b;
});
var result = arr.indexOf(num);
return result;
}
where([40, 60], 50);
16. Caesars Cipher
凯撒密码
(让上帝的归上帝,凯撒的归凯撒)
下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码。
移位密码也就是密码中的字母会按照指定的数量来做移位。
一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔ 'O',以此类推。
写一个ROT13函数,实现输入加密字符串,输出解密字符串。
所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,跳过它们。
ASCII字符
在JavaScript中可以通过String.prototype.charCodeAt()方法返回0至65535这间的整数,代表索引处理字符的UTF-16编码单元。可以通过这个方法查出每个字符对应的ASCII编码:
'a'.charCodeAt(); //97
'A'.charCodeAt(); //65
'abc'.charCodeAt(0); //97
'ABC'.charCodeAt(0); //65
如此一来,A-Z对应的就是65-90。而ROT13是将大写字符串将向后移13位,然后转换成对应的字符。那么:
- 小于65和大于90对应的就是小写字符a-z
- 大于等于65和小于等于77对应的就是大写字符A-M
- 大于等于78和小于等于90对应的就是大写字符N-Z
function rot13(str) {
var newStr='';
for(var i in str){
var temp= str.charCodeAt(i);
if(temp<65 || temp>91){
newStr+=str[i];
continue;
}
if(temp>77){
newStr+=String.fromCharCode(temp-13);
}else{
newStr+=String.fromCharCode(temp+13);
}
}
return newStr;
}
rot13("SERR CVMMN!")
网友评论