📌  相关文章
📜  将所有数字移到给定字符串的开头(1)

📅  最后修改于: 2023-12-03 14:53:50.889000             🧑  作者: Mango

主题:将所有数字移到给定字符串的开头

在这个主题下,我们将探讨一种常见的编程问题:将给定字符串中的所有数字移到字符串的开头部分。我们将通过不同的编程语言来介绍如何解决这个问题,并提供相关的代码示例。

问题描述

给定一个包含数字和其他字符的字符串,要求编写一个函数将所有数字移动到字符串的开头部分,并保持它们相对于原来的顺序不变。其他字符应该按照它们在原始字符串中的相对顺序留在字符串中。

解决方案

方案一:使用额外的空间

使用一个数组
  1. 创建一个空数组 num_array 和一个空字符串 non_num_string
  2. 遍历字符串中的每个字符:
    • 如果字符是数字,将它添加到 num_array 中。
    • 否则,将它添加到 non_num_string 中。
  3. num_arraynon_num_string 连接起来,得到最终结果。

代码示例:

def move_numbers_to_start(str):
    num_array = []
    non_num_string = ""
    for char in str:
        if char.isdigit():
            num_array.append(char)
        else:
            non_num_string += char
    return "".join(num_array) + non_num_string
复杂度分析

这种解决方案的时间复杂度是 O(n),其中 n 是输入字符串的长度。空间复杂度是 O(n),其中 n 是输入字符串的长度。

方案二:原地移动

使用双指针和字符数组
  1. 将字符串转换为字符数组(如果语言中字符串是可变的,可以跳过这一步)。
  2. 使用两个指针 leftright,初始时指向字符数组的开头和末尾。
  3. 向中间移动指针 left 直到找到数字字符。
  4. 向中间移动指针 right 直到找到非数字字符。
  5. 如果 leftright 的左侧,交换两个字符。
  6. 重复步骤 3-5,直到 leftright 相遇。

代码示例:

def move_numbers_to_start(str):
    arr = list(str)
    left, right = 0, len(arr) - 1

    while left < right:
        while not arr[left].isdigit() and left < right:
            left += 1
        while arr[right].isdigit() and left < right:
            right -= 1

        if left < right:
            arr[left], arr[right] = arr[right], arr[left]
    
    return "".join(arr)
复杂度分析

这个解决方案的时间复杂度是 O(n),其中 n 是输入字符串的长度。空间复杂度是 O(n),其中 n 是输入字符串的长度(如果字符数组是可变的,则是 O(1))。

结论

以上是两种不同的解决方案,用于将给定字符串中的所有数字移到字符串的开头部分。你可以根据自己的编程语言和偏好选择其中一种方案来实现。无论选择哪种方案,都应该能够有效地解决这个问题。