1、原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。
int removeElement(int* nums, int numsSize, int val)
{
int i = 0;
for (int j = 0; j < numsSize; j++)
{
if (nums[j] != val)
{
nums[i++] = nums[j];
}
}
return i;
}
2、删除排序数组中的重复项。
int removeDuplicates(int* nums, int numsSize){
int dst = 0;
int src1 = 0;
int src2 = 1;
while(src2<numsSize)
{
nums[dst]=nums[src1];
dst++;
if(nums[src1]!=nums[src2])
{
src1++;
src2++;
}
else
{
while(src2<numsSize && nums[src1]==nums[src2])
{
src2++;
}
src1=src2;
src2++;
}
}
if(src1<numsSize)
{
nums[dst]=nums[src1];
dst++;
}
return dst;
}
3、合并两个有序数组。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int len=m+n-1;
m--;
n--;
while(m >= 0 && n >= 0)
{
if(nums1[m] >nums2[n])
{
nums1[len--] = nums1[m--];
}
else
{
nums1[len--] = nums2[n--];
}
}
while(n >= 0)
{
nums1[len--] = nums2[n--];
}
}
4、向右旋转数组。
void reverse(int* nums, int start, int end)
{
while (start < end)
{
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;
reverse(nums, 0, numsSize - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, numsSize - 1);
}
5、数组形式的整数加法。
/** * Note: The returned array must be malloced, assume caller calls free(). */ void reverse(int* nums,int begin,int end)
{
while(begin<end)
{
int tmp = nums[begin];
nums[begin] = nums[end];
nums[end] = tmp;
++begin;
end--;
}
}
int* addToArrayForm(int* A, int ASize, int K, int* returnSize)
{
int* addRet = (int*)malloc(10001*sizeof(int));
int reti = 0;
int ai = ASize-1;
int next = 0;//进位值
while(ai>=0||K>0)
{
int x1 = 0;
if(ai>=0)
{
x1 = A[ai];
--ai;
}
int x2 = 0;
if(K>0)
{
x2 = K%10;
K/=10;
}
int ret=x1+x2+next;
if(ret>9)
{
ret%=10;
next = 1;
}
else
{
next=0;
}
addRet[reti++]=ret;
}
if(next==1)
{
addRet[reti++]=1;
}
reverse(addRet,0,reti-1);
*returnSize = reti;
return addRet;
}