C链表练习题leetcode
1.
题目
思路
实现
int removeDuplicates(int* nums, int numsSize){
//若为空数组,则赋值有问题
if(numsSize == 0)
return 0;
//prev指向第一个数 cur指向后一个数(初始为第一个数
//dst为新数组的下标
int prev = 0;
int cur = 1;
int dst = 0;
while(cur < numsSize)
{
//prev只有一个或者prev为多个相同中的最后一个,将prev赋值给dst
if(nums[prev] != nums[cur])
{
nums[dst] = nums[prev];
prev++;
cur++;
dst++;
}
//prev cur指向相同元素
else
{
prev++;
cur++;
}
}
//此时的下标为新数组的下标
//此时最后一个唯一的数没有被复制,循环到最后++
nums[dst] = nums[prev];
dst++;
prev++;
return dst;
}
2
题目
思路
实现
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* addToArrayForm(int* A, int ASize, int K, int* returnSize)
{
int KSize=0;//k有多少位
int KNum=K;
while(KNum)
{
++KSize;
KNum/=10;//得到K有多少位
}
//99+1234 与1234+99不同
int len=ASize>KSize?ASize:KSize;//获取更大的那位用于开辟空间
int* retArr= (int*)malloc(sizeof(int)*(len+1));//最多进一位 最大9+9=18
int Ai=ASize-1;//A数组最后一位,即A最开始的个位
//得到的结果往reti中存 三位数加三位数可能为三位数,也可能为四位数 所以要倒着存,先放在第0位 最后再逆至
int reti=0; //数组下标
int nextNum=0;//进位
//len--走len次,--len走len-1次
while(len--)
//3-- 返回值为3 --3返回值为2
//2-- 返回值为2 --2返回值为1
//0-- 返回值为0
//最后一组0没有进去。 最后一次1没进去
{
int a=0;
if(Ai>=0)
{
a=A[Ai];
Ai--;//如果是99+1234,获取最大位是4,执行四次循环 若不加条件判断则99减了两次变成负数
}
int ret=a+K%10+nextNum;//当Ai是一个负数时 说明A中所有位数相加完毕 把a置为0
//取前一位
K/=10;
//判断是否进位
if(ret>9)
{
ret-=10;//进位后得到个位 15->5
nextNum=1;
}
else
{
nextNum=0;//归零 防止影响下一次循环
}
retArr[reti]=ret;
reti++;
}
//跳出循环若最后两个值相加>10 处理进位
if(nextNum==1)
{
retArr[reti]=1;//举例:用于两个三位数得到一个四位数的情况,而三位数相加变成四位数首位一定是1
reti++;
}
//最终reti表示的就是数组的最后一位+1(跳出循环之前+1
//逆置数组
int left = 0, right =reti-1;
while (left <= right)
{
int tmp = 0;
tmp = retArr[left];
retArr[left] = retArr[right];
retArr[right] = tmp;
left++;
right--;
}
*returnSize=reti;//输出型参数
return retArr;
}
3
题目
思路
实现
void reverse(int* nums, int left,int right)
{
while(left<right)
{
int tmp = nums[left];
nums[left]=nums[right];
nums[right]=tmp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k)
{
//k有可能大于数组大小
k%=numsSize;
//前n-k个逆置,后k个逆置,注意下标问题
reverse(nums,0,numsSize-k-1);
reverse(nums,numsSize-k,numsSize-1);
reverse(nums,0,numsSize-1);
}
4
题目
思路
实现
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
//遍历数组
int *tmp = (int*)malloc(sizeof(int)*(m+n));
//开辟一个新空间存储
int i1 = 0;
int i2 = 0;
int i = 0;//新数组的数
while(i1 < m && i2 < n)
{
//将数组1中小的值往上放
if(nums1[i1]<nums2[i2])
{
tmp[i++]=nums1[i1++];
}
else
{
tmp[i++]=nums2[i2++];
}
}
//如果i1没有走到尾,把i1复制给tmp
while(i1<m)
{
tmp[i++] = nums1[i1++];
}
//如果i2没有走到尾,把i2复制给tmp
while(i2<n)
{
tmp[i++] = nums2[i2++];
}
//把tmp拷贝到nums1上
memcpy(nums1,tmp,sizeof(int)*(m+n));
free(tmp);
}