最近又在codewars上刷了5道题,作为一名小白,刚开始做算法题目总是困难重重,遇到不会的点也是会第一时间在网上找答案,一边学习一边做题。在这里和大家分享一下我的解题思路,其实作为一名小白我的第一思路都是暴力解法,完全不会考虑性能方面的问题,但是随着慢慢的学习以及解题后看到大神的解法也是惊叹,居然可以用几行代码就解决我是多行才解决的问题!也是对未来的学习越来越有动力。
下面就是我的最近的解题思路供大家参考。
1.给我一颗钻石(Give me a Diamond)
描述:
杰米是一名程序员,也是詹姆斯的女朋友。她喜欢钻石,想要詹姆斯的钻石绳。由于詹姆斯不知道如何做到这一点,他需要你的帮助。
您需要使用(*)字符返回一个在屏幕上打印时看起来像菱形的字符串。应删除尾随空格,并且每行必须以换行符 (\n) 结尾。
如果输入为偶数或负数,则返回,因为无法打印偶数或负数尺寸的钻石。
3 码钻石:
*
***
*
...将显示为字符串" *\n***\n *\n "
5 码钻石:
*
***
*****
***
*
...将显示为字符串" *\n ***\n*****\n ***\n *\n "
解析:
首先判断层数是否为奇数,否则返回null。然后在用
两个循环将每层的字符串拼接。每层的字符串由1,
3,5...的*组成,然后又是反着再来一遍是于是我们
用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(' ');
}