codeWar练习js

1.Build Tower即给定一个数,生成一个塔型结构

例如;n=2=>[' * ', '***'],n=3=>['  *  ', ' *** ', '*****']

function towerBuilder(nFloors) {
 return Array.from({length:nFloors}).map((v,i)=>{
  let space = ' '.repeat(nFloors-i-1)
  return space + '*'.repeat(i+i+1) + space
 })
}

2.Product of consecutive Fib numbers

斐波那契数列在以下的整数序列数(FN):

0, 1, 1,2, 3, 5,8, 13, 21,34, 55, 89,144, 233,…

给定一个数,例如Prod,可以使两个斐波那契数F(n)*F(n+1)得到,这时返回(n,n+1,true)例如:

productFib(714) # should return [21, 34, true], 
                # since F(8) = 21, F(9) = 34 and 714 = 21 * 34

productFib(800) # should return [34, 55, false], 
                # since F(8) = 21, F(9) = 34, F(10) = 55 and 21 * 34 < 800 < 34 * 55

如果找不到这个数的话,当F(n)*F(n- 1)

(1)我自己的写法

function productFib(prod){
// 四舍五入设定循环中间值
  let sqrtProd = Math.round(Math.sqrt(prod)/2)
  for(let i=1;i=a*b)&& (prod<=b*c)){
    	if(a*b===prod){return [a,b,true]}
    	if(b*c===prod){return [b,c,true]}
	return [b,c,false]}
  }
}
//斐波那契数列
function fibonacci(number){
    let arr =[0,1]
    if(number===0){
        return 0
    } else if(number ===1){
        return 1
    } else{
      for(let i=1;i

(2)大神的写法

function productFib(prod){
    let [a,b]=[0,1]
    while(a*b

3.Human Readable Time

输入一个秒数,把他换算成一个可读的时间HH:MM:SS。

HH:00-99,MM:00-59,SS:00-59

(1)我的写法

function humanReadable(seconds) {
  let HH=padZero(Math.floor(seconds/60/60))
  let MM = padZero(Math.floor((seconds-HH*60*60)/60))
  let SS = padZero(Math.floor(seconds-HH*60*60-MM*60))
  if(SS === '60'){
      SS = '00'
      MM = HH +1
  }
  if (MM==='60'){
      MM = '00'
      HH = HH +1
  }
  return HH+':' + MM+':'+SS
}

function padZero(str){
return str.toString().length==2?str:'0'+str
}

(2)较好的其他答案

function humanReadable(seconds){
    var pad = function(x){
        return x<10?'0'+x?x
    }
    return pad(parseInt(seconds/60/60)) + ':' + pad(parseInf(seconds/60%60)) + ':' + pad(parseInt(seconds%60))
}

4.Regex Password Validation

写一个匹配密码的正则表达式,至少包含一个小写字母一个大写字母和一个数字,长度至少为6

(1)通常的写法

function validate(password) {
  return /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{6,}$/.test(password);
}

(2)巧妙的写法

function validate(password) {
  return  /^[A-Za-z0-9]{6,}$/.test(password) &&
          /[A-Z]+/           .test(password) &&
          /[a-z]+/           .test(password) &&
          /[0-9]+/           .test(password) ;
}

5.Perimeter of squares in a rectangle

codeWar练习js_第1张图片

该图显示了6个正方形,其边的长度为1, 1, 2、3, 5, 8。很容易看出,这些方阵的周长之和是:4×(1+1+2+3+5+8)=4×20=80。给定一个n,你能算出这n+1个正方形的周长吗

(1)我的解法

function perimeter(n) {
    return 4 * fib(n)
}
function fib(x){
  var a=1,b=1
  let arr = [1,1]
  for(let i=1;i{
    return x+y
  })
}

大家的解题思路都差不多,就不贴其他人的答案了

6.String incrementer

给定一个字符串,如果字符串以数字结尾,那么返回结尾数字+1的字符串,如果字符串没有数字结尾,返回字符串+1,如果字符串为空,返回‘1’

例如:far =》 far1

            far001=》far002

            far099=》far100

(1)我的解法

function incrementString (string) {
  if(string===''){return '1'}
  let a = string.match(/[0-9]/g)
  if(a==null){
    return string + '1'
  }
  else{
    let num = parseInt(string.match(/[0-9]/g).join(''))+1
    let nlength = (num + '').length
    if(nlength

(2)我觉得比较好的答案

function incrementString (strng) {
  var m = strng.match(/^(\w*?)(\d*)$/);
  var next = (parseInt('0'+m[2], 10) + 1) + '';
  return m[1] + m[2].slice(0, -next.length) + next;
}
跟我的思路差不多,不过,他通过match把字符串一分为二,然后把数字项+1,得到数字项和数字项的长度,最后字符串拼接,m(2).slice(0,-next.length)是除去最后结果的数字项,得到的0的位数。

7.Double Cola

一群人排队喝可乐,每个喝到人都会分裂成2个(名字一样)排到队伍的最后面,给定一群人的名字数组集合names,和可乐的数量r,问谁是最后喝到可乐的人

(1)我的答案

function whoIsNext(names, r){
  let length =names.length
  if(r<=length){
   return names[r-1]
  }
  let n=1
  while(r>0){
    r=r-n*length
    if(r>=0 && (r-(2*n)*length) <= 0){
     n=2*n
     return names[Math.ceil(r/n)-1]
    }
	n=2*n
  }
}

(2)优质答案

function whoIsNext(names, r) {
  var l = names.length;
  while (r >= l) { r -= l; l *= 2; }
  return names[Math.ceil(names.length * r / l)-1];
}
跟我的思路差不多,但是人家更简单一些

你可能感兴趣的:(学习笔记)