编程题-移动零

题目:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

解法一(双指针):

使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。每次交换,都将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。注意到以下性质:

1、左指针左边的数均为非零数;

2、右指针左边直到左指针处均为零。

在进行if判断时,不需要考虑nums[left]是否为零,只需判断nums[right]不为零时进行数组元素的交换,并让left指针前进一位,这样右指针左边到左指针处均为0元素,如下代码:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size(), left = 0, right = 0;
        //右指针移动至尾部时,跳出循环体
        while (right < n) {
            //当nums[right]为非零数字时进入if条件语句
            if (nums[right]) {
                //swap函数交换nums[left]与nums[right]的值
                swap(nums[left], nums[right]);
                left++;
            }
            right++;
        }
    }
};
  • 时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。

  • 空间复杂度:O(1)。只需要常数的空间存放若干变量。

笔者小记:在交换nums[left]和nums[right]两个数组的值时,可以使用C++标准数据库中的swap()函数来直接交换两个数组的值,可简化不必要的代码量。

### 关于 Python 排序算法的实训题目与教程 在 Python 编程语言中,排序是一个非常重要的主题。无论是通过内置函数还是手动实现各种经典排序算法,掌握这些技能对于提高编程能力至关重要。 #### 使用 `sorted()` 和 `.sort()` 方法 Python 提供了两种简单易用的方法来完成排序操作:`sorted()` 函数和列表对象自带的 `.sort()` 方法[^1]。 - **`sorted(iterable)`**: 返回一个新的已排序列表,不会修改原始数据结构- **`.sort()`**: 对原列表进行就地排序,不创建新列表。 以下是两者的对比示例: ```python data = [3, 1, 4, 1, 5] # 使用 sorted() new_data = sorted(data) print(new_data) # 输出: [1, 1, 3, 4, 5] print(data) # 原始 data 不变: [3, 1, 4, 1, 5] # 使用 .sort() data.sort() print(data) # 数据被直接修改为: [1, 1, 3, 4, 5] ``` #### 手动实现常见排序算法 除了利用现成工具外,理解并实践经典的排序算法也是必要的。下面列举了一些常见的排序方法及其基本原理: ##### 1. 冒泡排序 (Bubble Sort) 冒泡排序是一种简单的比较交换类排序算法,其核心思想是比较相邻两个元素的位置关系,并逐步将较大的值移动至数组末端[^2]。 ```python def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] swapped = True if not swapped: break ``` ##### 2. 插入排序 (Insertion Sort) 插入排序的工作方式类似于人们整理扑克牌的方式——每次取一张新的卡片插入到已经排好序的部分之中。 ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key ``` ##### 3. 快速排序 (Quick Sort) 快速排序采用分治法策略,在整个序列上选取一个“基准”元素,将其余部分划分为小于等于该基准以及大于它的子集,之后递归处理这两个分区[^1]。 ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr)//2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` ##### 4. 计数排序 (Counting Sort) 当待排序的数据范围有限时,可以考虑使用计数排序这种线性复杂度 O(n+k) 的高效算法[^2]。 ```python from collections import defaultdict def counting_sort(arr): max_val = max(arr) count_dict = defaultdict(int) for num in arr: count_dict[num] += 1 result = [] for value in range(max_val + 1): if count_dict[value]: result.extend([value]*count_dict[value]) return result ``` #### 练习题推荐 为了巩固所学知识,可以通过解决实际问题加深印象。这里提供几个适合练习的经典题目[^2][^3]: 1. **统计频率**:给定一组字符串组成的列表,计算其中每个单词出现的频次,并找出最常出现的那个词。 2. **随机抽样**:编写程序模拟抽奖活动,从指定范围内抽取若干个互异号码作为获奖者名单。 3. **逆序对数量**:定义一对索引(i,j),满足i<j且arr[i]>arr[j]则称为一次逆序现象;设计一种有效手段统计任意整数列中存在的全部此类配对数目总和。 4. **稳定性的检验**:分别运用多种不同类型的排序技术针对同一份初始状态相同的测试样本实施运算过程观察最终结果是否存在差异从而判断它们各自的稳定性特征表现如何? 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值