#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。
要求时间复杂度为O(N),空间复杂度为O(1)。
int removeElement(int* nums, int numsSize, int val)
{
int scr = 0;
int dest = 0;
while (scr < numsSize)
{
if (nums[scr] != val)//不是则放里面
{
nums[dest] = nums[scr];
scr++;
dest++;
}
else //是则跳过
{
scr++;
}
}
return dest;
}
删除排序数组中的重复项。
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
int removeDuplicates(int* nums, int numsSize)
{
if (numsSize == 0)
{
return 0;
}
int prev = 0;
int cur = 1;
int dest = 0;
while (cur < numsSize)
{
if (nums[cur] != nums[prev])
{
nums[dest] = nums[prev];
prev++;
cur++;
dest++;
}
else
{
prev++;
cur++;
}
}
nums[dest] = nums[prev];
dest++;
prev++;
return dest;
}
整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。
例如,对于 num = 1321 ,数组形式是[1, 3, 2, 1] 。
给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。
int* addToArrayForm(int* num, int numSize, int k, int* returnSize)
{
int kSize = 0; // 用于计算 k 的位数
int kNum = k; // 保留 k 的原始值,方便后续处理
while (kNum)
{
++kSize;
kNum = kNum / 10; // 这里使用 kNum 而不是修改 k
}
// 确定需要处理的最大长度
int len = numSize > kSize ? numSize : kSize
// 分配返回数组,预留一个额外空间以处理进位
int* retArr = (int*)malloc(sizeof(int) * (len + 1));
int Ai = numSize - 1; // 数组从尾部开始处理
int reti = 0; // retArr 的当前索引
int nextNum = 0; // 表示进位
while (len) // 修复:len 是一个固定值,应逐步减少到 0
{
int a = 0;
if (Ai >= 0) // 如果 num 数组还有数字,则取出当前数字
{
a = num[Ai];
Ai--;
}
int ret = a + k % 10 + nextNum; // 当前位相加,包含进位
k /= 10; // k 去掉最低位
if (ret > 9) // 如果结果大于 9,则需要进位
{
ret -= 10;
nextNum = 1;
}
else
{
nextNum = 0;
}
retArr[reti] = ret; // 保存当前位的结果
++reti;
--len; // len 递减,确保循环退出
}
if (nextNum == 1) // 如果最后还有进位,则补充到结果数组中
{
retArr[reti] = 1;
reti++;
}
// 逆置数组
int left = 0;
int right = reti - 1;
while (left < right)
{
int tmp = retArr[left];
retArr[left] = retArr[right];
retArr[right] = tmp;
left++;
right--;
}
*returnSize = reti; // 设置返回数组的大小
return retArr;
}