当前位置: 首页 > 工具软件 > FreeCodeCamp > 使用案例 >

FreeCodeCamp——javaScript基础算法

锺离边浩
2023-12-01

1、将摄氏度转换为华氏度

从摄氏转换为华氏的公式是,摄氏温度乘以 9/5,再加上 32

思路:直接按照公式套就可以了

解题:

function convertToF(celsius) {
  let fahrenheit=celsius*(9/5)+32;
  return fahrenheit;
}

convertToF(30);

2、反转字符串

请反转传入函数的字符串,函数的返回结果也应为字符串。

思路

方法一:直接for循环遍历字符串

方法二

① 把字符串转为数组,用split方法;
② 使用数组的reverse方法将数组元素反转
③ 使用join方法把数组转为字符串

解题:

方法一

  function reverseString(str) {
  let reversedStr = "";
  for (let i = str.length - 1; i >= 0; i--) {
    reversedStr += str[i];
  }
  return reversedStr;
}

reverseString("hello");

方法二

function reverseString(str) {
  let strArr = str.split('');
  strArr = strArr.reverse().join('');
  return strArr;
}

reverseString("hello");
console.log(reverseString("hello"))

3、计算整数的阶乘

返回一个给定整数的阶乘计算结果。

思路:使用递归的思想,依次调用函数,直到num=1

解题

function factorialize(num) {
  return num > 0 ? num * factorialize(num - 1) : 1;
}

factorialize(5);

4、找出字符串中的最长单词

返回给出的句子中,最长单词的长度。

要求实例

输入:findLongestWordLength(“The quick brown fox jumped over the lazy dog”)
输出 :6
输入:findLongestWordLength(“What if we try a super-long word such as otorhinolaryngology”)
输出:19

思路

① 把字符串转为数组,用split方法;
② 遍历数组
③ 比较数组元素的长度

解题

function findLongestWordLength(str) {
  let words = str.split(' ');
  let LongestWordLength = 0;

  for (let i = 0; i < words.length; i++) {
    if (words[i].length > LongestWordLength) {
      LongestWordLength = words[i].length;
    }
  }
  return LongestWordLength;
}

findLongestWordLength("The quick brown fox jumped over the lazy dog");
console.log(findLongestWordLength("The quick brown fox jumped over the lazy dog"))

5、找出多个数组中的最大数字

请返回一个数组,该数组由参数中每个子数组中的最大数字组成

要求实例:

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

思路:

① 定义一个新的数组result用于存最大值
② 遍历数组,将数组arr里的子数组的第一个元素值赋给maxNumber
③ 遍历每一个子数组,进行判断比较,后找出最大的元素赋值给maxNumber最后放入数组result中。

解题:

function largestOfFour(arr) {
  const result = [];
  for (let i = 0; i < arr.length; i++) {
    let maxNumber = arr[i][0];
    for (let j = 1; j < arr[i].length; j++) {
      if (arr[i][j] > maxNumber) {
        maxNumber = arr[i][j];
      }
    }
    result[i] = maxNumber;
  }
  return result;
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
console.log(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]))

6、确认结尾

检查字符串(第一个参数 str)是否以给定的目标字符串(第二个参数 target)结束。

要求实例

输入:confirmEnding(“Congratulation”, “on”)
输出:true

思路

方法一

① 使用slice方法,截取指定的元素
②判断截取的元素是否与目标字符串全等,全等返回true,否则返回false

方法二:直接使用正则表达式,正则表达式$表示”以什么结尾“

方法三:直接用endsWith方法来判断某字符串是否是某字符串的末尾字符

解题

方法一

function confirmEnding(str, target) {
  if (str.slice(str.length - target.length) === target) {
	//if (str.slice(- target.length) === target)
    return true
  } 
    return false;
}

confirmEnding("Bastian", "n");
console.log(confirmEnding("Bastian", "n"))

方法二:

function confirmEnding(str, target) {
  const regexp = new RegExp(target + '$')
  return regexp.test(str);
}
confirmEnding("Bastian", "n");
console.log(confirmEnding("Bastian", "n"))

方法三:

function confirmEnding(str, target) {
  if(str.endsWith(target)) {
    return true;
  }else{
    return false;
  }
}

7、重复输入字符串

将一个给定的字符串 str(第一个参数)重复输出 num(第二个参数)次。 如果 num 不是正数,返回空字符串。

思路:

方法一:创建一个空串,然后使用for循环,将str累加到accumulatedStr

方法二:使用三元目运算符和递归的思想

方法三:用方法repeat,里面填需要复制的次数

解题:

将一个给定的字符串 str(第一个参数)重复输出 num(第二个参数)次。 如果 num 不是正数,返回空字符串。

function repeatStringNumTimes(str, num) {
//方法一
//   let accumulatedStr = "";
//   for (let i = 0; i < num; i++) {
//     accumulatedStr += str;
//   }
//   return accumulatedStr;
   //方法二
   return num>0?str+repeatStringNumTimes(str, num-1):""
}
repeatStringNumTimes("abc", 3);
console.log(repeatStringNumTimes("abc", 3))

方法三:

function repeatStringNumTimes(str, num) {
  if(num <=0) {
    str = "";
  }else{
    str = str.repeat(num);
  }
  return str;
  
}

8、截断字符串

如果传入的字符串(第一个参数)的长度大于传入的值(第二个参数),请在这个位置截断它, 并在后面加上 …,然后返回结果。

要求实例:

输入:truncateString(“A-tisket a-tasket A green and yellow basket”, 8)
输出:A-tisket…

思路: 先比较字符串的长度和num的大小,然后用slice的方法截取字符串拼接’…’

解题:

function truncateString(str, num) {
  if (str.length > num) {
    return str.slice(0, num) + "...";
  } else {
    return str;
  }
  // return str.length > num ? str.slice(0, num) + "..." : str;
}

truncateString("A-tisket a-tasket A green and yellow basket", 8);
console.log(truncateString("A-tisket a-tasket A green and yellow basket", 8))

9、按参数过滤数组

请写一个函数来检查数组(第一个参数 arr)中的元素,并返回数组中第一个通过校验测试的元素。 其中,“通过校验测试”指的是对于数组中的一个元素 x,若 func(x) 返回的结果为 true,则校验测试通过。 如果没有元素通过测试,请返回 undefined

要求实例:

输入:findElement([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; })
输出:8
输入:findElement([1, 3, 5, 9], function(num) { return num % 2 === 0; })
输出:undefined

思路:遍历过滤,即遍历数组,然后调用函数判断,有则输出,没有则返回undefined

解题:

function findElement(arr, func) {
  for (let i = 0; i < arr.length; i++) {
    if (func(arr[i])) {
      return arr[i];
    }
  }
  return undefined
}

findElement([1, 2, 3, 4], num => num % 2 === 0);
console.log(findElement([1, 2, 3, 4], num => num % 2 === 0))

10、基本类型布尔值的检查

检查一个值是否是基本类型中的布尔值(boolean)类型。 函数应返回 true 或者 false
基本类型中的布尔值为 true 或者 false

思路:一种是直接判断参数是否为true或者false,另一种则是使用typeof方法来判断是否为‘boolbean

解题:

function booWho(bool) {
  // return bool === true || bool === false ? true : false;
  return typeof (bool) == "boolean"
}

booWho(null);
console.log(booWho(null))

11、句中单词首字母大写

请将传入的字符串中,每个单词的第一个字母变成大写并返回。 注意除首字母外,其余的字符都应是小写的。

要求实例:

输入:titleCase(“I’m a little tea pot”)
输出:I’m A Little Tea Pot

思路:

① 把字符串转为数组,用split方法;
②遍历数组,先全部转为小写,再转首字符为大写
③使用join方法拼接成字符串

解题:

function titleCase(str) {
  let strArr = str.split(' ');

  for (let i = 0; i < strArr.length; i++) {
    strArr[i] = strArr[i].toLowerCase().split('');
    strArr[i][0] = strArr[i][0].toUpperCase();
    strArr[i] = strArr[i].join('');
  }
  return strArr.join(' ');
}

titleCase("I'm a Little tea pot");
console.log(titleCase("I'm a Little tea pot"))

12、Slice 与 Splice

将第一个数组中的所有元素依次复制到第二个数组中。
需要从第二个数组索引值为 n 的地方开始插入。
最后,请返回插入元素后的数组。 作为输入参数的两个数组在函数执行前后应保持不变。

要求实例:

输入:frankenSplice([1, 2, 3], [4, 5], 1)
输出: [4, 1, 2, 3, 5]
输入:frankenSplice([1, 2, 3, 4], [], 0)
输出:[1, 2, 3, 4]
函数运行后,第一个数组应保持不变。
函数运行后,第二个数组应保持不变。

思路:

①因为题目有要求数组应保持不变,所以用数组的slice方法复制出array;
②循环遍历arr1,依次将arr1里的元素插入到array里,此处用到了splice方法,题目要求“按照顺序插入”,所以n坐标要递增。

解法:

function frankenSplice(arr1, arr2, n) {
  let array = arr2.slice();
  for (let i = 0; i < arr1.length; i++) {
    array.splice(n, 0, arr1[i]);
    n++;
  }
  return array;
}
frankenSplice([1, 2, 3], [4, 5, 6], 1);
console.log(frankenSplice([1, 2, 3], [4, 5, 6], 1))

13、过滤数组中的假值

从数组中移除所有假值(falsy values)。
JavaScript 中的假值有 falsenull0""undefinedNaN

要求实例:

输入:bouncer([7, “ate”, “”, false, 9])
输出:[7, “ate”, 9]

思路:

方法一:新建一个临时数组,遍历数组里的每一项,判断其布尔值是否为true,然后将true项放入临时数组里。

解法:

function bouncer(arr) {
  let array = [];
  for (let i = 0; i < arr.length; i++) {
    if (Boolean(arr[i]) === true) {
      array.push(arr[i]);
    }
  }
  return array;
}

bouncer([7, "ate", "", false, 9]);
console.log(bouncer([7, "ate", "", false, 9]))

14、找出元素在排序后数组中的索引

数组(第一个参数)在排序后,将一个值(第二个参数)插入该数组,并使数组保持有序。返回这个新插入元素的最小索引值。 返回值应为一个数字。

例如,getIndexToIns([1,2,3,4], 1.5) 应该返回 1 因为1.5 大于 1(索引为 0)且小于 2(索引为 1)。
同样地,getIndexToIns([20,3,5], 19) 应该返回 2。 因为数组排序后会变成 [3,5,20],而 19 小于 20(索引为 2)且大于 5(索引为 1)。

思路:用数组sort方法,把数组排序,然后遍历数组,若元素大于等于num,则返回其下标。

解题:

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

getIndexToIns([40, 60], 50);
console.log(getIndexToIns([40, 60], 50))

15、比较字符串

如果数组里的第一个字符串包含了第二个字符串中的所有字母,则返回 true

例如,["hello", "Hello"] 应该返回 true。因为在忽略大小写的情况下,第一个字符串包含了第二个字符串里出现的所有字母。
["hello", "hey"] 应该返回 false。因为 hello 并不包含字符 y
最后,["Alien", "line"] 应该返回 true。因为 line 中的所有字母都出现在了 Alien 中。

思路:因为题目要求忽略大小写,所以先转为小写,遍历test字符串,如果target字符串里不包含test字符串的字符就返回false,返回true。也可以写成target.indexOf(test[i]) == -1

解法:

function mutation(arr) {
  let target = arr[0].toLowerCase();
  let test = arr[1].toLowerCase();
  for (let i = 0; i < test.length; i++) {
    if (target.indexOf(test[i]) < 0) {
      return false;
    }
  }
  return true;
}

mutation(["hello", "hey"]);
console.log(mutation(["hello", "hey"]))

16、分割数组

请编写一个函数,该函数将一个数组(第一个参数)拆分成若干长度为 size(第二个参数)的子数组,并将它们作为二维数组返回。

要求实例:

输入:chunkArrayInGroups([“a”, “b”, “c”, “d”], 2)
输出:[[“a”, “b”], [“c”, “d”]]

思路:创建一个数组用于存储分割的数组元素,遍历原数组,用slice方法分割,每分割一次就把这些值放到新数组里 。

解法:

function chunkArrayInGroups(arr, size) {
  let newArr = [];
  for (let i = 0; i < arr.length; i += size) {
    newArr.push(arr.slice(i, i + size));
  }
  return newArr;
}
chunkArrayInGroups(["a", "b", "c", "d"], 2);
console.log(chunkArrayInGroups(["a", "b", "c", "d"], 2))

如有其他解法可以相互交流--------------觉得可以的话先来个赞啦!!!
 类似资料: