小哆啦解题记:Z字形排列的迷雾挑战
小哆啦开始力扣每日一题的第十八天
今天,小哆啦被一道题目困住了——Z字形排列。看着题目,她皱起了眉头:“什么叫‘Z字形’排列?按行排列吗?可是怎么排列,Z又怎么回事?”一时间,题目就像一团雾,笼罩着她的脑袋。
“小智,快来帮帮我!”小哆啦焦急地呼唤,准备向她的智囊小智寻求帮助。
小智的提示:“小哆啦,别急,听我说。题目的意思是让你将字符串按行填充成Z字形的方式,也就是说,字符是从上到下填充,然后往上走再继续填充。你可以从最简单的方式开始,逐步优化。”
“哦!原来是这样!”小哆啦点了点头,“我明白了!那我就从最傻的办法开始,先试试!”
步骤一:最笨的办法——二维数组填充
小哆啦想:“既然Z字形排列就是从上到下再折返,那我就用一个二维数组,每行按顺序填充字符就好了。”
于是,她动手写代码,填充每一行的字符,走到底部就回头再走。她的代码是这样写的:
function convert(s: string, numRows: number): string {
if (numRows === 1 || numRows >= s.length) {
return s;
}
let rows: string[] = new Array(numRows).fill("");
let currentRow = 0;
let goingDown = false;
for (let char of s) {
rows[currentRow] += char;
if (currentRow === 0 || currentRow === numRows - 1) {
goingDown = !goingDown;
}
currentRow += goingDown ? 1 : -1;
}
return rows.join('');
}
她一边写一边自言自语:“这个方法好像可以做到,至少能存储每行的字符。”然而,当她看到二维数组时,顿时有点心虚,“但这样会不会浪费空间呢?”
小智的提示:“确实,这样存储空间有点浪费。而且在方向转换时,效率也有待提高。你可以考虑用一个一维数组来存储每行的字符,减少不必要的空间。”
小哆啦恍然大悟:“对啊!不必那么多行,省省空间!”
步骤二:空间优化——一维数组
小哆啦决定按照小智的建议,将二维数组改为一维数组。她只需要控制当前行的状态,逐步拼接字符。每次填充完一个字符后,判断是否到达顶部或底部,根据情况改变方向。
function convert(s: string, numRows: number): string {
if (numRows === 1 || numRows >= s.length) {
return s;
}
let rows: string[] = new Array(numRows).fill("");
let currentRow = 0;
let goingDown = false;
for (let char of s) {
rows[currentRow] += char;
if (currentRow === 0 || currentRow === numRows - 1) {
goingDown = !goingDown;
}
currentRow += goingDown ? 1 : -1;
}
return rows.join('');
}
她看着代码,心里想:“这个方法不止能让空间优化,还减少了冗余的逻辑。”代码写完了,测试一下,结果果然是对的,Z字形排列完成了!小哆啦开心地跳了起来:“哇!终于做出来了!不过,还能更简洁吗?”
小智的提示:“嗯,代码已经不错了,但你可以进一步简化。其实可以直接拼接字符到最终结果,不必单独存储每一行。”
小哆啦一愣:“哇,原来还可以更简洁,太酷了!”她兴奋地重新看了下题目,觉得解法越来越顺手了。
步骤三:进一步简化——最终优化
小哆啦决定完全去除存储每一行字符的过程。她决定用一个变量拼接最终结果,减少空间浪费,直接将字符按行拼接成最终的字符串。这样,代码更加简洁,空间也得到了更高效的利用。
function convert(s: string, numRows: number): string {
if (numRows === 1 || numRows >= s.length) {
return s;
}
let rows: string[] = new Array(numRows).fill("");
let currentRow = 0;
let goingDown = false;
for (let char of s) {
rows[currentRow] += char;
if (currentRow === 0 || currentRow === numRows - 1) {
goingDown = !goingDown;
}
currentRow += goingDown ? 1 : -1;
}
return rows.join('');
}
小哆啦的总结:“嗯,现在的代码简洁多了,空间也减少了。通过每一步的优化,我的思路变得更加清晰了!谢谢小智的帮助!”
小哆啦的感悟:
“通过今天的挑战,我真切体会到解题的过程不只是写代码那么简单。从一个不理解的题目开始,经过反复的思考、逐步的优化,最终能得到一个简洁高效的解法。这就像在迷雾中摸索,总会有一条清晰的道路在等着你。”
Z字形排列,原来如此!每次的优化都让我离最优解更近一步!
通过这次的解题经历,小哆啦不仅解决了Z字形排列的难题,还学会了如何从复杂到简单逐步优化思路。每一次的进步,都是成长的脚印!