C#构建星号金字塔时字符串右侧无padding问题求助
问题成因
- 你对C#中
PadLeft()/PadRight()方法的参数定义理解错误:这两个方法传入的参数是填充完成后字符串的总长度,不是你要额外追加的填充字符数量。比如你当前层星号字符串长度为1,调用PadLeft(2)只会在左侧补1个空格让总长度到2,再调用PadRight(2)时字符串总长度已经符合要求,不会在右侧追加任何内容,自然就出现只有左侧有填充的问题。 - 总填充量的计算逻辑错误:每层需要的左右填充总和应该是「底层最大星号数
maxStars- 当前层星号数numOfStars」,你现在写的maxStars - floorNum - 1的计算结果本身就不符合实际需要的填充总量。
修复方案
你可以直接通过拼接左右空格的方式实现,避免对Pad方法参数的理解误差,修复后的代码如下:
public class Kata { public static string[] TowerBuilder(int nFloors) { string[] tower = new string[nFloors]; int maxStars = 2 * nFloors - 1; for( int floorNum = 0; floorNum < nFloors; floorNum++ ) { int numOfStars = 2 * (floorNum + 1) - 1; int padding = (maxStars - numOfStars) / 2; tower[floorNum] = new string(' ', padding) + new string('*', numOfStars) + new string(' ', padding); } return tower; } }
如果你要继续使用Pad方法实现,正确写法应该是把最终总长度传入:
// 单条语句即可实现居中 string centeredFloor = floor.PadLeft(numOfStars + padding).PadRight(maxStars);
内容的提问来源于stack exchange,提问作者AYellowGalaxy
相关产品推荐
相关产品推荐

