当前位置: 代码迷 >> 综合 >> 2. 算法编程练习:Give me a Diamond
  详细解决方案

2. 算法编程练习:Give me a Diamond

热度:99   发布时间:2023-11-22 20:44:23.0

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} 21021

描点后观察图像求出表达式:

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)=?2i?2n?1?+n(这里原理和空格数函数求解一样,故没有过多叙述,可尝试动手做一做,梳理过程。)


Algorithm details

  1. 输入n,n为int
  2. if n是否为负、零或则是偶数:then输出null/nil/None/…
  3. else:
    1. for i in range(n):
      1. 定义空字符串:diamond = ’‘
      2. diamond字符串第一部分空格数计算公式:diamond += ’ ‘*|i-\frac{n-1}{2}|
      3. diamond第二部分符号**’‘**数计算公式:diamond += '’*-2|i-\frac{n-1}{2}|+n
      4. diamond第三部分’’/n’'符号:diamond += ’/n‘
  4. 输出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

  相关解决方案