Codewars刷题之路-js篇(2)

266 阅读4分钟

最近又在codewars上刷了5道题,作为一名小白,刚开始做算法题目总是困难重重,遇到不会的点也是会第一时间在网上找答案,一边学习一边做题。在这里和大家分享一下我的解题思路,其实作为一名小白我的第一思路都是暴力解法,完全不会考虑性能方面的问题,但是随着慢慢的学习以及解题后看到大神的解法也是惊叹,居然可以用几行代码就解决我是多行才解决的问题!也是对未来的学习越来越有动力。

下面就是我的最近的解题思路供大家参考。

1.给我一颗钻石(Give me a Diamond)

描述:

杰米是一名程序员,也是詹姆斯的女朋友。她喜欢钻石,想要詹姆斯的钻石绳。由于詹姆斯不知道如何做到这一点,他需要你的帮助。

您需要使用(*)字符返回一个在屏幕上打印时看起来像菱形的字符串。应删除尾随空格,并且每行必须以换行符 (\n) 结尾。

如果输入为偶数或负数,则返回,因为无法打印偶数或负数尺寸的钻石。

3 码钻石:

 *
***
 *

...将显示为字符串" *\n***\n *\n "

5 码钻石:

  *
 ***
*****
 ***
  *

...将显示为字符串" *\n ***\n*****\n ***\n *\n "

解析:

    首先判断层数是否为奇数,否则返回null。然后在用
    两个循环将每层的字符串拼接。每层的字符串由135...的*组成,然后又是反着再来一遍是于是我们
    用repeat()将*接入然后,接入\n,打印时自动转
    行,repeat()调用的参数可看下列代码,这里不作过
    多赘述。

代码

function diamond(n){
  if(n % 2 == 0 || n <= 0)
        return null
    var floor = '';
    var x = 1;
    for(let i = 0; i < n/2; i ++) {
       floor = floor + ' '.repeat(n/2-i) + '*'.repeat(x) + '\n'
       x +=2
    }
    x = n - 2
    for(let j = n; j > n/2+1; j --) {
        floor = floor + ' '.repeat(n+1-j) + '*'.repeat(x) + '\n'
        x -=2
    }
    return floor
}

2.创建电话号码(Create Phone Number)

描述:

编写一个接受 10 个整数(介于 0 和 9 之间)的数组的函数,该数组以电话号码的形式返回这些数字的字符串。

createPhoneNumber([1, 2, 3, 4, 5, 6, 7, 8, 9,
0]) // => returns "(123) 456-7890"

返回的格式必须正确才能完成此质询。 不要忘记右括号后面的空格!

解析:

    这里只需要调用substr()函数。我觉得这题还是很简
    单得,这里就不过多讲述。只需要看我下面得代码就
    行。

代码:

function createPhoneNumber(numbers){
  const nums = numbers.join ('');
    const a = nums.substr(0,3);
    const b = nums.substr(3,3);
    const c = nums.substr(6,4);
    return '(' + a +') ' + b + '-' +c;
}

3.标签生成器(The Hashtag Generator)

描述:

营销团队花费了太多时间输入主题标签。 让我们用我们自己的标签生成器帮助他们!

这是交易:

它必须以主题标签 (#) 开头。 所有单词的首字母必须大写。 如果最终结果超过 140 个字符,则必须返回 false。 如果输入或结果是空字符串,则必须返回 false。

" Hello there thanks for trying my Kata"  =>  "#HelloThereThanksForTryingMyKata"
"    Hello     World   "                  =>  "#HelloWorld"
""                                        =>  false

解析:

    首先利用Array.split()将字符串以' '为间隔符转换
    成数组,此时数组里会有许多' '元素,这时我们再判
    断是否为' '将它剔除,利用Str.toUpperCase()将
    首字母大写,以及将原单词的首字母剔除,与前面的
    大写字母拼接,然后组成到输出字符串里。
    这里注意测试题中要求长度大于140的字符串要判定为
    false,所以我们最后要判断一下。

代码:

function generateHashtag (str) {
    var sence = str.split(' ')
    var word = '#'
    for(let i = 0; i < sence.length; i ++) {
        if(sence[i] != '') {
            sence[i] = sence[i][0].toUpperCase() + sence[i].slice(1)
            word = word + sence[i]
        }
    }
    if(word == '#' || word.length > 140){
       return false 
    } else {
       return word 
    }
  }
  console.log(generateHashtag("Codewars       is nice"));

4.建造塔(Build Tower)

描述:

建造一个金字塔形的塔,作为一个数组/字符串列表,给定一个正整数的楼层数。塔块用“*”字符表示。

例如,一座 3 层的塔看起来像这样:

  "  *  ",
  " *** ", 
  "*****"

一座 6 层的塔看起来像这样:

  "     *     ", 
  "    ***    ", 
  "   *****   ", 
  "  *******  ", 
  " ********* ", 
  "***********"

解析:

    这题与第一题类式,但是我做这题时并没有学习到第
    一题的repeat()函数所以,这题写的并不好,可以参
    考第一题来解。这里我只是套用两个循环然后依旧是
    每层多两个'**'以及' '的拼接。

代码:

function towerBuilder(nFloors) {
    // build here
    var arr = ['*'];
    var x = '*';
    var y = '';
    console.log(typeof z);
    for(let i = 0; i < nFloors; i ++) {
        for(let j = 1; j <= i; j ++) {
            x = x + '**';
            y = y.substr(1,(y.length - 1));
        }
        for(let k = nFloors - 1; k > i; k --) {
            y = y + ' ';
        }
        arr[i] =y + x + y;
        x = '*';
        y = '';
    }
    return arr;
  }

5.简单的猪拉丁语(Simple Pig Latin)

描述:

将每个单词的第一个字母移到其末尾,然后在单词末尾添加“ay”。保持标点符号不变。

解析:

    我们先照旧用split()字符串转换成数组,利用循环
    和shift()将每个字符串首字母剔出,再push()在每
    个字符串的末尾加入首字母和'ay'。但是句子中会有
    标点符号,符号不需要加ay。所以我们再嵌套一个判
    断,单词长度>1坑定不是符号直接进行以上操作,若
    单词长度为1也可能是字母所以我用条件
    sence[i] >= 'a' && sence[i] <= 'z' || 
    sence[i] >= 'A' && sence[i] <= 'Z'
    来判断。

代码:

function pigIt(str){
    //Code here
    var sence = str.split(' ');
    var word = [];
    var x = '';
    for(let i = 0; i < sence.length; i++) {
        word = sence[i].split('');
        if(sence[i].length > 1){
            // sence[i] = sence[i] + word;
            x = word.shift();
            word.push(x);
            word.push('ay');
        }else if(sence[i] >= 'a' && sence[i] <= 'z' || sence[i] >= 'A' && sence[i] <= 'Z') {
            word.push('ay');
        }
        sence[i] = word.join('');
    }
    return sence.join(' ');
  }