顺序表——习题

1. 轮转数组

代码实现:

cpp 复制代码
// 逆置数组
void nizhi_array(int *nums, int l, int r) { // 左闭右闭
    if (l >= r) {
        return ;
    }
    for (int i = l, j = r; i < j; i++, j--) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

void rotate(int *nums, int numsSize, int k) {
    if (nums == NULL || k == 0 || numsSize == 1) {
        return ;
    }
    if (k > numsSize) {
        k %= numsSize;
    }
    nizhi_array(nums, 0, numsSize - 1);
    nizhi_array(nums, 0, k - 1);
    nizhi_array(nums, k, numsSize - 1);
}

2. 合并两个有序数组

代码实现: 把数组nums2元素添加在数组nums1元素后面,再冒泡排序

cpp 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int k = m;
    for (int i = 0; i < n; i++) {
        nums1[k++] = nums2[i];
    }
    int flag = 1; // 标志位优化 当序列在找到所有的最大值之前就已经将序列排好序了,直接结束循环
    for (int i = nums1Size - 1; i >= 1 && flag; i--) { // i决定了哪一轮冒泡
        flag = 0;
        for (int j = 0; j < i; j++) { // j决定哪两个元素进行比较
            if (nums1[j] > nums1[j + 1]) {
                flag = 1;
                int temp = nums1[j];
                nums1[j] = nums1[j + 1];
                nums1[j + 1] = temp;
            }
        }
    }
}

3. 移动零

**代码实现:**双指针

cpp 复制代码
void moveZeroes(int *nums, int numsSize){
    int l = 0; // 指向零
    int r = 0; // 不指向零
    while (r < numsSize) {
        if (nums[r] != 0) {
            int temp = nums[r];
            nums[r] = nums[l];
            nums[l] = temp;
            l++;
        }
        r++;
    }
}

4. 复写零

代码实现:

cpp 复制代码
void duplicateZeros(int *arr, int arrSize) {
    for (int i = 0; i < arrSize; i++) {
        if (arr[i] == 0) {
            for (int j = arrSize - 1; j > i + 1; j--) {
                arr[j] = arr[j - 1];
            }
            if (i < arrSize - 1) {
                arr[i + 1] = 0;
            } 
            i += 1;
        }
    }
}

5. 删除有序数组中的重复项

代码实现:

cpp 复制代码
int removeDuplicates(int* nums, int numsSize){
    for (int i = 1; i < numsSize; i++) {
        if (nums[i] == nums[i - 1]) {
            for (int j = i; j < numsSize -1; j++) {
                nums[j] = nums[j + 1];
            }
            i--;
            numsSize--;
        }
    }
    return numsSize;
}

6. 颜色分类

代码实现:

(1)单指针

cpp 复制代码
void swap(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

void sortColors(int *nums, int numsSize) {
    int ptr = 0;
    for (int i = 0; i < numsSize; ++i) { // 先将数组中的0排好
        if (nums[i] == 0) {
            swap(&nums[i], &nums[ptr]);
            ++ptr;
        }
    }
    for (int i = ptr; i < numsSize; ++i) { // 再将数组中的1排在0后面,剩下的全部都是2
        if (nums[i] == 1) {
            swap(&nums[i], &nums[ptr]);
            ++ptr;
        }
    }
}

(2)双指针

cpp 复制代码
void swap(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

void sortColors(int *nums, int numsSize) {
    int p0 = 0, p1 = 0;
    for (int i = 0; i < numsSize; ++i) {
        if (nums[i] == 1) {
            swap(&nums[i], &nums[p1]);
            ++p1;
        } else if (nums[i] == 0) {
            swap(&nums[i], &nums[p0]);
            if (p0 < p1) {
                swap(&nums[i], &nums[p1]);
            }
            ++p0;
            ++p1;
        }
    }
}

7. 加一

代码实现:

cpp 复制代码
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* plusOne(int *digits, int digitsSize, int *returnSize) {
    for (int i = digitsSize - 1; i >= 0; i--) {
        if (digits[i] == 9) {
            digits[i] = 0;
        } else {
            digits[i]++;
            *returnSize = digitsSize;
            return digits;
       }
   }
    *returnSize = digitsSize + 1;
    int *ret = (int*)malloc(sizeof(int) * (digitsSize + 1));
    memset(ret, 0, sizeof(int) * (digitsSize + 1));
    ret[0] = 1;
    return ret;
}

8. 多数元素

**代码实现:**投票法
因为多数元素在数组里出现的次数绝对大于n/2,所以用其他元素消去多数元素,剩下的必然是多数元素(两两抵消)

cpp 复制代码
int majorityElement(int *nums, int numsSize){
    int a = nums[0]; // 投票对象
    int flag = 1; // 票数
    for (int i = 1; i < numsSize; i++) { // 遍历投票对象
        if (a == nums[i]) { // 投票对象相同,票数+1
            flag++;
        } else { // 投票对象不同,票数-1
            flag--;
            if (flag < 0) { // 该元素不是多数元素,更新投票对象并把票数置1
                a = nums[i];
                flag = 1;
            }
        }
    }
    return a; 
}

9. 丢失的数字

代码实现:计数排序思想

cpp 复制代码
int missingNumber(int *nums, int numsSize) {
    int arr[numsSize + 1];
    memset(arr, 0, sizeof(arr));
    int i;
    for (i = 0; i < numsSize; i++) {
        arr[nums[i]]++;
    }
    for (i = 0; i <= numsSize; i++) {
        if (arr[i] == 0) {
            break;
        }
    }
    return i;
}
相关推荐
Duck Bro11 分钟前
数据结构:顺序表(动态顺序表)
c语言·数据结构·c++·学习·算法
jinmo_C++2 小时前
数据结构——链表(带有头节点)
数据结构·链表
一直学习永不止步2 小时前
LeetCode题练习与总结:迷你语法分析器--385
java·数据结构·算法·leetcode·字符串··深度优先搜索
邂逅you3 小时前
深度优先搜索之全排列问题(C语言版)
c语言·数据结构·学习·算法·贪心算法·深度优先
皮卡兽3 小时前
嵌入式课程day07-C语言流程控制语句作业
c语言·数据结构·算法
我不是程序猿儿3 小时前
【数据结构】汇编语言和机器语言的‘数据结构‘
开发语言·数据结构·汇编语言·机器语言
ZIM学编程3 小时前
C语言入门案例练习2——找素数
c语言·数据结构·算法
shiji-lu4 小时前
考研要求掌握C语言(归并排序)
c语言·开发语言·数据结构·考研·算法·排序算法
2401_858286115 小时前
94.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删
c语言·数据结构·链表
野草y7 小时前
数据结构(8.7_2)——败者树
数据结构