Give me a Diamond
Jamie is a programmer, and James’ girlfriend. She likes diamonds, and wants a diamond string from James. Since James doesn’t know how to make this happen, he needs your help.
Task
You need to return a string that looks like a diamond shape when printed on the screen, using asterisk (*
) characters. Trailing spaces should be removed, and every line must be terminated with a newline character (\n
).
Return null/nil/None/...
if the input is an even number or negative, as it is not possible to print a diamond of even or negative size.
Examples
A size 3 diamond:
*
****
…which would appear as a string of " *\n***\n *\n"
A size 5 diamond:
****
*********
…that is:
" *\n ***\n*****\n ***\n *\n"
Algorithm analysis
输入是一个整数型,不能是负数、零和偶数。输出是一个字符串,观察字符串数据结构,包括空格、、/n 三个部分。输入的整数正好是*/n**的个数,可以理解为行数,可以想到是一个循环操作,一共有n次循环。涉及到对称结构要想到绝对值函数。还有个关键问题就是空格和*号的个数如何确定。
涉及找规律,明确数字变化确实,是增是减,有增有减最常见的构造是加绝对值。这和初高中学的函数练习了起来,只是这里并不是连续函数。明确自变量比如 i for range(n),此处的range(n)相当于定义域,i相当于自变量,因变量就是得出的那个结果。我们需要得出的正是这个离散函数。
那么应该如何得出这个离散函数?
离散函数连续化,利用常规求连续函数的办法。对于简单的线性函数可以通过利用数形结合的思想,确定一个定义域或至于,因为n没办法得出,所以任意取一个较小的值(本文取5)。再根据自变量和因变量描点连线,求出表达式(可能需要用到函数图形平移与变换知识)。
比如该算法中的空格个数和**”*“**的个数变化规律,自变量范围为:
一般地自变量范围为 0 , 1 , 2 , 3 , 4 , ? , n ? 1 {0, 1, 2, 3, 4,\cdots, n-1} 0,1,2,3,4,?,n?1, 取n=5;
对应空格数为:
2 , 1 , 0 , 2 , 1 {2, 1, 0,2, 1} 2,1,0,2,1
描点后观察图像求出表达式:
f ( i , n ) = ∣ i ∣ f(i,n)=|i| f(i,n)=∣i∣平移变换为 f ( i ? 2 ) = ∣ i ? 2 ∣ f(i-2)=|i-2| f(i?2)=∣i?2∣注意这里的2,是否会随着n的变化而变化,理解2的内涵,它是计数5中间那个数,所以用 n ? 1 2 \frac{n-1}{2} 2n?1?代替最终得到 f ( i , n ) = ∣ i ? n ? 1 2 ∣ f(i,n)=|i-\frac{n-1}{2}| f(i,n)=∣i?2n?1?∣
对应”*“号个数为:
1 , 3 , 5 , 3 , 1 {1, 3, 5, 3, 1} 1,3,5,3,1
描点后观察图像求出表达式:
F ( i , n ) = ? 2 ∣ i ? n ? 1 2 ∣ + n F(i,n)=-2|i-\frac{n-1}{2}|+n F(i,n)=?2∣i?2n?1?∣+n(这里原理和空格数函数求解一样,故没有过多叙述,可尝试动手做一做,梳理过程。)
Algorithm details
- 输入n,n为int
- if n是否为负、零或则是偶数:then输出null/nil/None/…
- else:
- for i in range(n):
- 定义空字符串:diamond = ’‘
- diamond字符串第一部分空格数计算公式:diamond += ’ ‘*|i-\frac{n-1}{2}|
- diamond第二部分符号**’‘**数计算公式:diamond += '’*-2|i-\frac{n-1}{2}|+n
- diamond第三部分’’/n’'符号:diamond += ’/n‘
- for i in range(n):
- 输出null或则diamond字符串
Code
def diamond(n):if n <= 0 and n % 2 != 1:return Noneelse:diamond = ""for i in range(n):diamond += " " * abs(i-(n-1)//2)diamond += "*" * (-2*abs(i-(n-1)//2)+n)diamond += "\n"return diamond
Thans for reading
题目来源:www.codewars.com