1. 题目背景与需求解析
这道来自贵州大学的机试题"字符移动"看似简单,却暗藏玄机。作为字符串处理类的基础题型,它常出现在各大高校的编程实验课和机试环节中。题目要求通常可以概括为:给定一个由字母和数字组成的字符串,将所有字母按原顺序移动到字符串前部,数字按原顺序移动到后部,且不改变字母和数字各自的原始顺序。
举个例子,输入"a1b2c3d4",处理后应该得到"abcd1234"。这种题型在数据处理、信息过滤等场景中非常实用,比如从混杂的日志中分离文本和数字信息,或是预处理用户输入的表单数据。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法思路拆解
2.1 双指针法实现
最优雅的解决方案是使用双指针技术。我们可以在原字符串上直接操作(如果语言允许)或者使用辅助空间。具体步骤如下:
- 初始化两个空字符串(或字符数组):letters和digits
- 遍历原始字符串,将字母追加到letters,数字追加到digits
- 合并letters和digits作为最终结果
python复制def move_chars(s):
letters = []
digits = []
for char in s:
if char.isalpha():
letters.append(char)
else:
digits.append(char)
return ''.join(letters + digits)
注意:这里使用了Python的列表而非字符串拼接,因为列表的append操作时间复杂度为O(1),而字符串拼接在多次操作时性能较差。
2.2 原地交换法进阶
如果题目要求必须在原字符串上修改(如C/C++场景),可以采用双指针原地交换法:
- 使用快慢指针,快指针遍历字符串,慢指针标记字母应插入的位置
- 当快指针遇到字母时,与慢指针位置交换,然后慢指针前进
- 最终数字会自动被"挤"到字符串后部
c复制void moveChars(char *s) {
int slow = 0;
for (int fast = 0; s[fast]; fast++) {
if (isalpha(s[f
