测试开发学习中。。。。
1.数组去重,原地修改返回新长度
int removeDuplicates(int nums[], int size) { if (size == 0) return 0; // 慢指针从0开始,第一个元素必然保留 int slow = 0; for (int fast = 1; fast < size; fast++) { // 快慢值不同,说明是新元素 if (nums[fast] != nums[slow]) { slow++; nums[slow] = nums[fast]; // 原地覆盖 } } // slow是下标,长度需要+1 return slow + 1; }2.移动零,把数组全部 0 挪到末尾,其他元素顺序不变
void moveZeroes(int nums[], int size) { // slow:存放非0元素的下一个位置 int slow = 0; // fast遍历数组,找所有非0数字 for (int fast = 0; fast < size; fast++) { if (nums[fast] != 0) { // 把非0数字挪到slow位置 nums[slow] = nums[fast]; slow++; } } // slow前面全是非0,slow到末尾全部填0 for (int i = slow; i < size; i++) { nums[i] = 0; } }3.合并区间,将重叠区间合并
#include <stdlib.h> /* 比较函数:按照区间左端点排序 */ int cmp(const void *a, const void *b) { int *x = *(int **)a; int *y = *(int **)b; return x[0] - y[0]; } /** * Return an array of arrays of size *returnSize. * The sizes of the arrays are returned in *returnColumnSizes. */ int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes) { if (intervalsSize == 0) { *returnSize = 0; *returnColumnSizes = NULL; return NULL; } /* 1. 按照左端点排序 */ qsort(intervals, intervalsSize, sizeof(int *), cmp); /* 2. 开辟结果数组 */ int **result = (int **)malloc(sizeof(int *) * intervalsSize); *returnColumnSizes = (int *)malloc(sizeof(int) * intervalsSize); int count = 0; /* 3. 合并区间 */ for (int i = 0; i < intervalsSize; i++) { /* 第一个区间,或者没有重叠 */ if (count == 0 || intervals[i][0] > result[count - 1][1]) { result[count] = (int *)malloc(sizeof(int) * 2); result[count][0] = intervals[i][0]; result[count][1] = intervals[i][1]; (*returnColumnSizes)[count] = 2; count++; } else { /* 有重叠,更新右端点 */ if (intervals[i][1] > result[count - 1][1]) { result[count - 1][1] = intervals[i][1]; } } } *returnSize = count; return result; }4.给定数组,输出全部子数组,求每个子数组最大最小差值之和
class Solution { public: long long subArrayRanges(vector<int>& nums) { long long ans = 0; int n = nums.size(); for (int i = 0; i < n; i++) { int maxVal = nums[i]; int minVal = nums[i]; for (int j = i; j < n; j++) { maxVal = max(maxVal, nums[j]); minVal = min(minVal, nums[j]); ans += maxVal - minVal; } } return ans; } };5.三数之和,数组找三元组和为 0
int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } /** * @param nums 输入数组 * @param numsSize 数组长度 * @param returnSize 返回结果二维数组行数 * @param returnColumnSizes 每行元素个数(固定为3) * @return 二维数组存储所有三元组 */ int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) { *returnSize = 0; if (numsSize < 3) return NULL; // 排序 qsort(nums, numsSize, sizeof(int), cmp); // 动态分配结果空间,最多 n^2 组,这里预分配足够大 int maxAns = numsSize * numsSize; int** res = (int**)malloc(maxAns * sizeof(int*)); *returnColumnSizes = (int*)malloc(maxAns * sizeof(int)); for (int i = 0; i < numsSize; i++) { int a = nums[i]; // 第一个数大于0,后面不可能和为0 if (a > 0) break; // 去重:和上一个a相同,跳过 if (i > 0 && nums[i] == nums[i - 1]) continue; int l = i + 1; int r = numsSize - 1; while (l < r) { int b = nums[l]; int c = nums[r]; int sum = a + b + c; if (sum == 0) { // 存入答案 res[*returnSize] = (int*)malloc(3 * sizeof(int)); res[*returnSize][0] = a; res[*returnSize][1] = b; res[*returnSize][2] = c; (*returnColumnSizes)[*returnSize] = 3; (*returnSize)++; // 跳过左侧重复 while (l < r && nums[l] == nums[l + 1]) l++; // 跳过右侧重复 while (l < r && nums[r] == nums[r - 1]) r--; l++; r--; } else if (sum < 0) { l++; // 和太小,左指针右移 } else { r--; // 和太大,右指针左移 } } } return res; }