原题
https://www.codewars.com/kata/576757b1df89ecf5bd00073b/train/cpp
题目
Build Tower by the following given argument:
number of floors (integer and always greater than0
).
Tower block is represented as*
or example, a tower of 3 floors looks like below
[
" * ",
" *** ",
"*****"
]
分析
实现比较简单,思路也有很多种。
本解法,先是构建了n
层的空格字符串数组,再按照每层*
的位置和长度进行填充覆盖。
所有解法都需要确定以下两个关系:
- 层数
n
与每个字符串长度l
的关系:l = 2*n-1
; - 层数
n
与每个非空格字符位置的关系:n-i-1
上面两个关系可以使用数学归纳法非常简单的推导出来。
参考答案
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Kata{
public:
vector<string> towerBuilder(int nFloors){
size_t len = 2*nFloors-1;
vector<string> res(nFloors,string(len,' '));
for(size_t i=0;i<nFloors;i++){
fill_n(res[i].begin()+(nFloors-i-1),2*i+1,'*');
}
return res;
}
};
说明
容器初始化时可以指定初始化值,这样可以避免另外的复制操作。
其它
无