文章 六月 12, 2020

codewars Give me a Diamonds

文章字数 4.6k 阅读约需 4 mins. 阅读次数 0

题目:杰米是个程序员,也是詹姆斯的女朋友。她喜欢钻石,想从詹姆斯那里得到一根钻石串。既然詹姆斯不知道怎么做,他需要你的帮助。

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

返回null/nil/None/。。。如果输入是偶数或负数,则无法打印偶数或负数大小的钻石。

三颗钻石:

 *
***
 *

显示为 " *\n***\n *\n"

五颗钻石:

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

显示为 " *\n ***\n*****\n ***\n *\n"

第一次尝试

 function diamond(n) {
            if (n > 1 && n % 2 == 0) {
                return null
            }
            let diam = ""
            const digui = (e) => {
                if (e == 1) {
                    let arr = []
                    for (let i = 0; i < n / 2 - .5; i++) {
                        arr.push(" ")
                    }
                    arr[arr.length] = "*"
                    arr[arr.length + 1] = "\n"
                    let a = arr.join("")
                    if (n == 1) {
                        diam = a
                        return;
                    }
                    diam = a + diam + a
                    return
                } else if (e == n) {
                    let arr = []
                    for (let i = 0; i < e; i++) {
                        arr.push("*")
                    }
                    arr[arr.length + 1] = "\n"
                    diam = arr.join("")
                    digui(e - 2)
                } else {
                    let arr = []
                    for (let i = 0; i < (n - e) / 2; i++) {
                        arr.push(" ")
                    }
                    for (let j = 0; j < e; j++) {
                        arr.push("*")
                    }
                    arr.push("\n")
                    let a = arr.join("")
                    diam = a + diam + a
                    digui(e - 2)
                }
            }

            digui(n)
            return diam;
        }

结果是对的,但是测试报了溢出内存,于是请教了下有了第二版。

第二次尝试

        const diamond = n => {
            if (n < 1 || n % 2 == 0) {
                return null
            }
            if (n == 1) {
                return "*\n"
            }
            let arr = [],
                diam = "";
            for (let i = 1; i <= n; i += 2) {
                arr.push(i)
            }
            let brr = [...arr]
            let arrMax = brr.pop()
            arrMax = (arrMax + 1) / 2;
            arr = [...arr, ...brr.reverse()]
            for (let j = 0; j < arr.length; j++) {
                arrMax--;
                console.log(arrMax)
                diam += " ".repeat(Math.abs(arrMax)) + "*".repeat(arr[j]) + "\n"
            }
            return diam
        }

这次算是提交成功了,但是还不是很简洁,但是进去了就可以看到大佬的答案,(⊙﹏⊙)

大佬的

function diamond (n) {
  if (n <= 0 || n % 2 === 0) return null
  str = ''
  for (let i = 0; i < n; i++) { 
    let len = Math.abs((n-2*i-1)/2)
    str += ' '.repeat(len)
    str += '*'.repeat(n-2*len)
    str += '\n'
  }
  return str
}
function diamond(n){
  if (n < 0 || !(n % 2)) return null; 
  const middleIndex = Math.floor(n / 2);

  return Array.apply(null, {length: n})
      .map((el, index) => {
        const indentation = Math.abs(index - middleIndex);
        const numberOfAsterisks = n - indentation * 2;
        return Array(indentation + 1).join(' ') + Array(numberOfAsterisks + 1).join('*');
      })
      .join('\n') + '\n';
}
function diamond(n){
  if (n < 0 || n % 2 == 0) return null;
  for (var i = 0, diamond = ''; i < n; i++) {
    var stars = n - Math.abs(n - 2*i - 1);
    var spaces = (n - stars) / 2;
    while (spaces-- > 0) diamond += ' ';
    while (stars-- > 0) diamond += '*';
    diamond += '\n';
  }
  return diamond;
}

给跪了,还需努力,加油!

0%