面试算法求助:字符串字母反转且数字位置不变的实现思路
解题思路与实现建议
核心用双指针法就能解决,不用额外提取字母再拼接,直接在你已经转换好的char数组上操作就行,步骤如下:
- 先定义两个指针:左指针
left从数组起始位置(0)开始,右指针right从数组末尾(charArray.Length - 1)开始 - 循环条件设为
left < right:- 左指针向右移动,跳过所有数字字符,直到找到第一个非数字字符
- 右指针向左移动,跳过所有数字字符,直到找到第一个非数字字符
- 交换这两个指针指向的非数字字符
- 左指针加1,右指针减1,继续循环
- 循环结束后,把char数组转回字符串就是结果
结合你现有的代码,完整实现如下:
string test = "test12pop90java989python"; var charArray = test.ToCharArray(); int left = 0; int right = charArray.Length - 1; while (left < right) { // 左指针找非数字 while (left < right && Char.IsNumber(charArray[left])) { left++; } // 右指针找非数字 while (left < right && Char.IsNumber(charArray[right])) { right--; } // 交换字符 if (left < right) { char temp = charArray[left]; charArray[left] = charArray[right]; charArray[right] = temp; left++; right--; } } string result = new string(charArray); Console.WriteLine(result); // 输出:tset12pop90avaj989nohtyp
这种方法时间复杂度是O(n)(n为字符串长度),每个字符最多被访问两次,空间复杂度为O(n)(对应你已经在做的char数组转换),效率高且逻辑清晰,很适合面试场景。
内容的提问来源于stack exchange,提问作者Kermi
相关产品推荐
相关产品推荐

