JS算法基础


——来源freecodecamp

将摄氏温度转换成华氏温度

将摄氏度转换为华氏度的算法为:摄氏度 × 9/5 + 32

输入参数 celsius代表一个摄氏温度值。请你根据上述转换公式,将已定义好的 fahrenheit变量赋值为对应的华氏温度的值。

你不需要顾虑 function 和 return 语句,它们会在之后的挑战中予以介绍。现在,你只需要使用你已学过的运算符。

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

convertToF(30);
翻转字符串

反转给出的字符串。

你在反转字符串前可能需要将其切分成字符的数组。

你的结果必须是一个字符串。

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

reverseString("hello");

我们需要掌握
str.split()
arr.reverse()
arr.join()

数字的阶乘

返回一个给定整数的阶乘。

若 n 是一个整数,n 的阶乘就是所有小于等于 n 的正整数的乘积。

n 的阶乘通常用符号 n!来表示。

例如: 5! = 1 * 2 * 3 * 4 * 5 = 120

只有非负整数会被作为函数的输入参数。

function factorialize(num) {
  if (num === 0) { return 1; }
  return num * factorialize(num-1);
}

factorialize(5);
//第二种方法是用arguments的属性callee指向拥有这个对象的函数
function factorial(num){
    if(num <= 1) {
         return 1;      
    }else{
          return num * arguments.callee(num-1);   
    }
}
查找字符串中最长的单词

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

你的返回应该是一个数字。

function findLongestWordLength(str) {
  var words = str.split(' ');
  var maxLength = 0;

  for (var i = 0; i < words.length; i++) {
    if (words[i].length > maxLength) {
      maxLength = words[i].length;
    }
  }

  return maxLength;
}
返回数组中最大的数字

返回一个数组,它要由给出的所有子数组中的最大值组成。简单起见,给出的数组总会包含4个子数组。

记得你可以在一个简单的 for 循环中遍历一个数组,并用 arr[i]这样的语法来访问数组中的元素。

function largestOfFour(arr) {
            var results = [];
            for (var i = 0; i < arr.length; i++) {
                var largestNumber = arr[i][0];
                for (var j = 1; j < arr[i].length; j++) {
                if (arr[i][j] > largestNumber) {
                    largestNumber = arr[i][j];
                }
                }

                results[i] = largestNumber;
                
            }               
            return results;
        }
算法基础:检查字符串的结尾

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

本题目可以用 ES2015 引入的 .endsWith()方法来解决。但本挑战的目的是让你使用 JavaScript 的一个 substring 方法。

function confirmEnding(str, target) {
  // "Never give up and good luck will find you."
  // -- Falcor
  return str.endsWith(target);
}

confirmEnding("Bastian", "n");
function confirmEnding(str, target) {
  // "Never give up and good luck will find you."
  // -- Falcor
  
  return str.slice(str.length - target.length) === target;
}

confirmEnding("He has to give me a new name", "name");
重复字符串

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

function repeatStringNumTimes(str, num) {
  var accumulatedStr = '';

  while (num > 0) {
    accumulatedStr += str;
    num--;
  }

  return accumulatedStr;
}
截断字符串

如果一个字符串(第一个参数)的长度大于给出的值(第二个参数),则截断它并在其后加上 …。返回被截断的字符串。

function truncateString(str, num) {
  // Clear out that junk in your trunk
  if (str.length > num && num > 3) {
    return str.slice(0, num) + '...';
  } else if (str.length > num && num <= 3) {
    return str.slice(0, num) + '...';
  } else {
    return str;
  }

}

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

truncateString(“A-tisket a-tasket A green and yellow basket”, 8)应该返回 “A-tisket…”。
truncateString(“Peter Piper picked a peck of pickled peppers”, 11)应该返回 “Peter Piper…”。
truncateString(“A-tisket a-tasket A green and yellow basket”, “A-tisket a-tasket A green and yellow basket”.length)应该返回 “A-tisket a-tasket A green and yellow basket”。
truncateString(“A-tisket a-tasket A green and yellow basket”, “A-tisket a-tasket A green and yellow basket”.length + 2)应该返回 “A-tisket a-tasket A green and yellow basket”。
truncateString(“A-”, 1)应该返回 “A…”。
truncateString(“Absolutely Longer”, 2)应该返回 “Ab…”。

发现者与看护者

请写一个函数来检查一个数组(第一个参数)中的元素,并返回数组中第一个通过校验测试(第二个参数,一个接受一个参数并返回一个布尔值的函数)的元素。如果没有元素通过测试,则返回 undefined。

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

检查一个值是否是原始的布尔值(boolean)类型。返回 true 或者 false。

布尔值原始类型为 true 或者 false。

function booWho(bool) {
  // What is the new fad diet for ghost developers? The Boolean.
  return typeof bool === 'boolean';
}

booWho(null);
单词的首字母大写

将给出的字符串中所有单词的第一个字母变成大写,并返回得到的字符串。请确保其余的字母是小写的。

出于练习的目的,“ the ”“ of ”等虚词的首字母也要大写。

function titleCase(str) {
  let newArr = str.toLowerCase().split(' ');
  for(let i=0;i<newArr.length;i++){
    newArr[i] = newArr[i].slice(0,1).toUpperCase() + newArr[i].slice(1);
  }
  return newArr.join(' ');
}

titleCase("I'm a little tea pot");
function titleCase(str) {
  return str.toLowerCase().replace(/(^|\s)\S/g, (L) => L.toUpperCase());
}
slice 和 splice

本挑战的输入参数为:两个数组和一个索引值。

请利用数组的 slice和 splice方法,将第一个数组中的所有元素依次复制到第二个数组中。

请从第二个数组中索引值为 n的地方开始插入。

返回插入元素后的数组。输入的两个数组在函数执行前后要保持不变。

function frankenSplice(arr1, arr2, n) {
  // It's alive. It's alive!
  let newArr = arr2.slice();
  for(let i=0; i<arr1.length; i++){
    newArr.splice(n, 0, arr1[i]);
    n++;
  }
  return newArr;
}

frankenSplice([1, 2, 3], [4, 5, 6], 1);
去除数组中的假值

从一个数组中移除所有假值(falsy values)。

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

提示:请尝试将每一个值转换为一个布尔值(boolean)。

function bouncer(arr) {
  // Don't show a false ID to this bouncer.
  return arr.filter(Boolean);
}

bouncer([7, "ate", "", false, 9]);
我身在何处

返回数组(第一个参数)被排序后,将一个值(第二个参数)插入到该数组中而使数组保持有序的最小的索引。返回的值应该是一个数字。

例如,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)。

function getIndexToIns(arr, num) {
  arr.sort(function(a, b) {
    return a - b;
  });

  for (var a = 0; a < arr.length; a++) {
    if (arr[a] >= num)
      return a;
  }

  return arr.length;
}
集合之间的关系

输入参数是一个有两个字符串元素的数组。如果第一个字符串中包含了第二个字符串中的所有字母,则返回 true。

例如,[“hello”, “Hello”]应该返回 true 因为第一个字符串中包含了第二个字符串中出现的所有字母(忽略大小写)。

而 [“hello”, “hey”]应该返回 false 因为第一个字符串 “hello” 没有包含字母 “y”。

最后,[“Alien”, “line”], 应该返回 true,因为 “line” 中的所有字母都被包含在 “Alien” 中。

function mutation(arr) {
  let newArr1 = arr[0].toLowerCase().split('');
  let newArr2 = arr[1].toLowerCase().split('');
  let len1 = newArr1.length;
  let len2 = newArr2.length;
  for(let i=0;i<len2;i++){
    if(newArr1.indexOf(newArr2[i])== -1){
      return false;
    }
  }
  return true;
}

mutation(["hello", "hey"]);
猴子吃香蕉(将一维数组分割为二维数组)

请写一个函数,将一个数组(第一个参数)分割成一组长度为 size(第二个参数)的数组,然后在一个二维数组中返回这些结果。

function chunkArrayInGroups(arr, size) {

  var temp = [];
  var result = [];

  for (var a = 0; a < arr.length; a++) {
    if (a % size !== size - 1)
      temp.push(arr[a]);
    else {
      temp.push(arr[a]);
      result.push(temp);
      temp = [];
    }
  }

  if (temp.length !== 0)
    result.push(temp);
  return result;
}
function chunkArrayInGroups(arr, size) {
  // Break it up.
  var arr2 = [];
  for (var i = 0; i < arr.length; i+=size) {
	arr2.push(arr.slice(i , i+size));
  }
  return arr2;
}
function chunkArrayInGroups(arr, size) {
      // Break it up.
      var newArr = [];
      var i = 0;

      while (i < arr.length) {
        newArr.push(arr.slice(i, i+size));
        i += size;
      }
      return newArr;
    }
    chunkArrayInGroups(["a", "b", "c", "d"], 2);
function chunkArrayInGroups(arr, size) {
	if (arr.length <= size){
		return [arr];
	}
	else {
		return [arr.slice(0,size)].concat(chunkArrayInGroups(arr.slice(size),size));
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值