# Codewars刷题之路-js篇(1)

404 阅读4分钟

1.奇数之和(Sum of odd numbers)

描述:

给定连续奇数的三角形:

             1
          3     5
       7     9    11
   13    15    17    19
21    23    25    27    29
...

计算此三角形第 n 行中的数字之和(从索引 1 开始),例如:(输入 --> 输出)

1 -->  1
2 --> 3 + 5 = 8

解析:

    通过这个三角形,我们可以看到每一层的第一个数字存在一定的规律。即可以通过差
    为1的等差数列求出每层第一个数为第几个数,然后通过差为2的差数列就和得出每一
    层的首个数字的值x,然后再进行等差数列求和求出该层的和y。

代码:

function rowSumOddNumbers(n) {
  // TODO
  const x = 1+(n*(1+n)/2-n)*2;
  const y = n*(x+x+(n-1)*2)/2;
  return y;
}

2.停止倒转我的话!(Stop gninnipS My sdroW!)

描述:

编写一个函数,该函数接收一个或多个单词的字符串,并返回相同的字符串,但所有五个或更多字母的单词都颠倒了(就像这个 Kata 的名字一样)。传入的字符串将仅由字母和空格组成。仅当存在多个单词时,才会包含空格。

spinWords( "Hey fellow warriors" ) => returns "Hey wollef sroirraw" 
spinWords( "This is a test") => returns "This is a test" 
spinWords( "This is another test" )=> returns "This is rehtona test"

解析:

    我们先将输入的字符串通过split()转换成以单词为元素的数组,再通过一个否循环来
    判断数组的每个单词得长度是否大于5,如果大于,则将改单词进一步通过split()转
    换成以字母为元素的数组,调用revers()将字母数组倒转,然后调用join()函数将字
    母数组还原成单词。循环结束后我们再次调用join()将单词数组还原成一句话,最后
    返回。

代码:

function spinWords(string){
  //TODO Have fun :
  var arrStr = string.split(' ');
    for(let i = 0;i < arrStr.length; i ++) {
        // console.log(arrStr[i]);
        if(arrStr[i].length >= 5) {
            arrStr[i] = arrStr[i].split('').reverse().join('');
        }
    }
    return arrStr.join(' ');
}

3.朋友还是敌人?(Friend or Foe?)

描述

创建一个程序来过滤字符串列表并返回一个列表,其中只有您的朋友姓名。 如果一个名字正好有4个字母,你可以确定它一定是你的朋友!否则,你可以确定他不是... 例如:输入 = [“Ryan”, “Kieran”, “Jason”, “Yous”], 输出 = [“Ryan”, “Yous”]

解析

首先创建一个空数组trueFriend用来存放我们的朋友,使用for循环判断原数组的每个元
素的长度是否等于4,如果等于4则将改元素存入trueFriend,循环结束返回trueFriend

代码

function friend(friends){
  //your code here
  var tureFriend = [];
    for(let i = 0; i < friends.length; i ++) {
        if(friends[i].length == 4) {
            tureFriend.push(friends[i]);
        }
    }
    return tureFriend;
}

4.巴士上的人数(Number of People in the Bus)

描述

市里有一辆公共汽车在行驶,每个公共汽车站都有人和下车。

您将获得整数对的列表(或数组)。每对元素表示在公交车站上车的人数(第一项)和下车人数(第二项)。

您的任务是返回最后一个公交车站(最后一个数组之后)仍在公交车上的人数。虽然是最后一个公交车站,但公交车上并没有空着,有些人还在公交车上,他们可能睡在那里:D

测试用例

assert.strictEqual(number([[10,0],[3,5],[5,8]]),5);

解析

通过测试用例可以看出输入的二维数组中每一组元素为每一站的上下车人数,且每一组元素
的第一个值为上车人数,第二个值为下车人数。
直接使用for循环计算每一站的上车与下车人数,最后返回计算值。

代码

var number = function(busStops){
  // Good Luck!
  var x = 0;
    for(let i = 0; i < busStops.length ; i ++) {
        x = x + busStops[i][0] -busStops[i][1];
    }
  return x;
}

5. 开膛破肚的巨魔(Disemvowel Trolls)

描述

巨魔正在攻击您的评论部分!

处理这种情况的常见方法是从巨魔的评论中删除所有元音,从而消除威胁。

你的任务是编写一个函数,该函数接受一个字符串并返回一个删除所有元音的新字符串。

例如,字符串“This website is for losers LOL!”将变成“Ths wbst s fr lsrs LL!”。

注意:对于这个kata y不被视为元音。

解析

要将每个单词中的元音字母“a,e,i,o,u”删除,需要先用split()将原字符串转换成数组,
然后使用for循环判断每个单词,再将每个单词用split()转换成数组存入word,再次使用
for循环判断每个字母是否为元音字母,如果不是则将每个单词字母组合成str,注意每个
单词判断结束后要将str的值清空,否则str不再是一个单独的单词而会变成一句话,然后
再将str放入reWord,最后使用join()将reWord转换成字符串返回。

代码

function disemvowel(str) {
  var arrStr = str.split(' ');
    var word = [];
    var reword = [];
    str = '';
    console.log(arrStr);
    for(let i = 0; i < arrStr.length; i ++) {
        word = arrStr [i].split('');
        // console.log(word);
        for(let j = 0; j < word.length; j ++){
            if(word[j] != 'a' && word[j] != 'e' && word[j] != 'i' && word[j] != 'o' && word[j] != 'u' &&
              word[j] != 'A' && word[j] != 'E' && word[j] != 'I' && word[j] != 'O' && word[j] != 'U') {
                str = str + word[j];
            } 
            reword[i] = str;   
        }
        str = '';
    }
    return reword.join(' ');
}