Codewars刷题初体验

634 阅读8分钟

Hello,大家好啊!最近开始接触了Codewars这个刷题网站,心里真的是感慨万千、又爱又恨。

372357AC71B5561DF554C2EEC228CE07.png 爱在Codewars的刷题风格:在Codewars中刷题就像是我们在打怪升级一样,不同难度的题目就像不同难度的小怪,解决掉它们就可以获得和难度相对应的经验值来提升我们的等级,这种模式真的很吸引人有木有?在一番“沉迷”之后,我的等级也是终于突破了萌新最低等级的8kyu

QQ截图20221120223014.png

感觉自己变得更强大了可以解决掉更厉害的小怪(题目)了哈哈哈。

刚开始我们肯定是先从简单题开始入手,我的Codewars第一题是这样的:

1. 将字符串转换为数字

QQ截图20221120233315.png 把字符串转换为数字? 这还不简单吗我心想 直接就开始coding:

const stringToNumber = function(str){
  return parseInt(str);
}

直接用parseInt() 就OK了。查阅了资料才知道,将字符串转换为数字,除了使用parseInt() 方法外,还有很多其他的方法:

  1. 使用** Number()**

Number()可用于将 JavaScript 变量转换为数字。我们可以用它来转换字符串太数字。 如果该值不能转换为数字,NaN则返回。

Number("10");           // returns 10
Number(" 10  ");        // returns 10
Number("10.33");        // returns 10.33
  1. 使用一元运算符 (+)

一元加号运算符 ( +) 在其操作数之前并计算其操作数,但如果尚未将其转换为数字,则尝试将其转换为数字。

const x = 25;
const y = -25;
console.log(+x); // expected output: 25
console.log(+y); // expected output: -25
console.log(+''); // expected output: 0

4.使用parseFloat() parseFloat()解析一个字符串并返回一个数字。允许空格。仅返回第一个数字。

parseFloat("10");        // returns 10
parseFloat("10.33");     // returns 10.33
parseFloat("10 20 30");  // returns 10
parseFloat("10 years");  // returns 10
  1. 使用 Math.floor() 该Math.floor()函数返回小于或等于给定数字的最大整数。这对于十进制数字可能有点棘手,因为它将最接近的整数的值返回为Number。

  2. 乘以数字 将字符串值乘以1不会改变值,并且默认情况下它会转换为数字。

str = '2344'
console.log(str * 1) // expected result: 2344
  1. 双波浪号 ( ~~ ) 运算符
str = '1234'
console.log(~~str) // expected result: 1234
我们继续看第二题:

2.偶数或奇数

QQ截图20221120235539.png

这道题也是很简单的,用if else就可以解决:
function evenOrOdd(number) {
  if ( (parseInt(number)) % 2 === 0) {
    return 'Even';
  } else {
    return 'Odd';
  }
}
但是更优的是使用三元运算符
function evenOrOdd(number) {
  return number %2 == 0 ? 'Even' : 'Odd'
}

前面说到对Codewars的初体验是又爱又恨,那要说恨在哪呢? 对于刚入门的新手的来说,前面刷一些较为简单的题目感觉还是很舒服的,而且也会小有些成就感,但是有些题目则会感到没什么思路,无从下手,或者是心中大概知道要怎么解,就是不知道代码从何写起。这个时候就是很考验我们coding能力和编程思想了,比如说我遇到的这题:

3. Exes and Ohs

QQ截图20221121000823.png

QQ截图20221121000858.png 看到这里就开始有些懵了🤔

1ECABDCF347162365B48A84CF5FC1309.png 检查字符串是否具有相同数量的“x”和“o”。该方法必须返回布尔值并且不区分大小写? 在一番百思不得其解之后于是开始在网上查阅资料才学习到了字符串中有种实例方法: String.prototype.match() 返回一个数组,成员是所有匹配的子字符串。

于是与心中开始有了思路:让字符串实例对象的match方法对字符串进行正则匹配,返回匹配结果:

function XO(str) {
  let x = str.match(/x/gi);
  let o = str.match(/o/gi);
  return (x && x.length) === (o && o.length);
}

顿时心中茅塞顿开,要学习更多的字符串的实例方法

  • String.prototype.match():返回一个数组,成员是所有匹配的子字符串。
  • String.prototype.search():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。
  • String.prototype.replace():按照给定的正则表达式进行替换,返回替换后的字符串。
  • String.prototype.split():按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。

在刷第四题的时候:

4. Disemvowel Trolls

QQ截图20221121003815.png

QQ截图20221121003841.png 编写一个函数,该函数接受一个字符串并返回一个删除所有元音的新字符串?

这个时候就想到了使用字符串对象的replace()方法可以替换匹配的值,配合正则表达式用replace()替换匹配的元音字符,就返回了没有元音字符的字符串,就实现了该函数功能了:
function disemvowel(str) {
  str = str.replace(/[aeiou]/gi,"")
  return str;
}

接着开始继续往下面刷:

5.元音计数

QQ截图20221121133417.png

QQ截图20221121133429.png 这道题和上面那道不同的地方是要返回字符串中元音的数量(计数) 🤔

我们开始用编程的思想一步步去解这道题:

首先,我们要创建一个变量 vowelsCount 并将其设置为 0

再创建 一个vowels 数组,这样我们就可以把每个元音都放在一个地方,后面就可以使用这个数组。


function getCount(str) {

  let vowelsCount = 0

  const vowels = ['a', 'e', 'i', 'o', 'u']

}

接下来我们是不是需要查看输入字符串 str 中的每一个字符,检查或查看字符串中的每个字符,以便确定它是否是元音?

为此,我们可以使用适用于字符串的 for ... of 语句。


function getCount(str) {

  let vowelsCount = 0

  const vowels = ['a', 'e', 'i', 'o', 'u']

  for (let char of str) {

    // ...

  }

}

这里需要提一下的是,我们对于for...in语句也许比较熟悉,它和for ... of不同的是: for in遍历的是数组的索引(index),而for of遍历的是数组元素值(value

现在,在for循环中,我们可以查看并遍历字符串中的每个字符。接下来,我们要检查每个字符是否都是元音。

要做到这一点,我们可以 使用includes 方法。includes() 方法决定一个数组是否在其条目中包含了某个值。如果是,则返回 true,如果不是,则返回 false 使用 includes ,我们将检查元音数组中是否包含当前正在循环中迭代的字符。


function getCount(str) {

  let vowelsCount = 0

  const vowels = ['a', 'e', 'i', 'o', 'u']

  for (let char of str) {

    if (vowels.includes(char)) {

       // ...

    }

  }

}

我们已经创建了 if 语句来检查当前字符是否是元音,如果这个字符是元音,那么我们要增加 vowelsCount 变量,为此,我们可以在JavaScript中使用递增运算符。最后,让我们的函数返回 vowelsCount 变量就OK了。


function getCount(str) {

  let vowelsCount = 0

  const vowels = ['a', 'e', 'i', 'o', 'u']

  for (let char of str) {

    if (vowels.includes(char)) {

       vowelsCount++

    }

  }

  return vowelsCount

}

这道题也许用正则表达式去解会很简单:

function getCount(str) {
  return (str.match(/[aeiou]/ig)||[]).length;
}

但是这种解法我们可以学习到includes()for...of遍历这两个方法,同样也能使我们变得更强。

总结

Codewars刷题对于要学习代码的同学来说无疑是一个能够有效锻炼、提升coding能力的好方式。但是其中最为重要的是它能够直接训练到我们的编程思想

我们懂很多API、数据结构、算法,但那不是编程思想,是编程能力。编程思想就像是我们的大脑去控制我们的身体一样,它会自然地指导、诱发你如何写代码的行为。我们不能只有四肢发达,而头脑跟不上对吧。注意,我并不是只在强调编程思想的重要性,编程能力固然重要,一个程序员的进化,实际上是编程思想的培养、形成、发展、成熟的过程。就像我们长大,不单单只是身体上的变化,最重要的是我们的思想变得成熟了、考虑问题变得全面了、更能明白许许多多事物中的道理和规律了并且知道怎么去遵循和使用,在我看来,这才是一个真正成熟且优秀的程序员所应该具备的!

而我们通过不断的学习和实践练习,学习各种设计的模式以及运行的规律等等等提升自己编程能力的同时,总结出自己的心得体会并将自己心中的编程思想的逐渐建立,并持之以恒!相信定会有一天,我们不仅仅只是随着年龄和阅历的增长变得更加成熟,而作为我们即将要成为的程序员来说也是如此 🙂

OK,以上就是关于我个人初次刷Codewars的体会与心得,非常感谢大家的观看,写得较为冗杂还请大家多多见谅。如果大家觉得喜欢或者有所收获的话,还请点点赞关关注多多支持一下哦嘿嘿。我们下篇再见,拜拜886~

04E43B5E09107D28CDDEC3FADD7524D5.png