1:原地移除数组中所有的元素val(时间复杂度为O(N)空间复杂度为O(1))
题目的大概意思是:用户自行输入一个数组,还要输入一个val的整形值,然后从数组中移除等于val的元素
我们根据题目的要求,时间复杂度为O(N)空间复杂度为O(1)
可以用以下的办法:
用一个for循环将数组遍历,再用if语句进行判断,如果不等于val的值,我们就将这个元素放入数组中,如果等于val的话i就继续+1,不放入数组中
代码实现如下:
int removeElement(int* nums, int numsSize, int val)
{
int i = 0;
int pos = 0;
int ret=0;
for (i = 0; i < numsSize; i++)
{
if (nums[i] != val)
{
nums[pos] = nums[i];
pos++;
ret++;
}
}
return ret;
}
2:删除排序数组中的重复项
题目的要求是删除数组中的重复项,使其只出现一次,然后返回整个数组,并按照它们最初在 nums 中出现的顺序排列,并且输出数组的大小
这题我们可以使用双指针的思路来解决:
用while循环遍历,如果nums[src]!=nums[dst],nums[1](也就是nums[++dst])就等于nums[src],然后dst和src依次++,如果nums[src]=nums[dst]的话,src就直接++,dst不用++
代码实现如下:
int removeDuplicates(int* num, int numsSize)
{
int src = 1;
int dst = 0;
while (src < numsSize)
{
if (num[src] != num[dst])
{
num[++dst] = num[src++];
}
else
src++;
}
return dst + 1;//返回数组的大小
}
3:合并两个有序数组
本题是将两个有序的数组最后合并为一个有序数组,然后返回,我们可以先将数组nums2放入nums1中,然后再将nums1进行一次排序,然后返回nums1
代码实现如下:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
//直接用qsort排序
//int i = 0;
//int pos = 0;
//for (i = 0; i < n; i++)
//{
// nums1[m + i] = nums2[pos++];
//}
//qsort(nums1, nums1Size, sizeof(int), cmp);
//这种方法也比较简单,是将两个数组中末位的元素进行比较
int end1 = m - 1;
int end2 = n - 1;
int i = m + n - 1;
while (end1 >= 0 && end2 >= 0)
{
if (nums1[end1] >= nums2[end2])
{
nums1[i--] = nums1[end1--];
}
else
{
nums1[i--] = nums2[end2--];
}
}
while (end2 >= 0)
{
nums1[i--] = nums2[end2--];
}
}
4:旋转数组
这个题目算是很简单的,在我之前的文章中也讲解过,所以这里不做过多的解释了
代码如下:
大致的思路就是先将前k个元素旋转,然后旋转后一部分,然后再整体旋转
void swap(int* a, int* b)
{
int t = *a;
*a = *b, *b = t;
}
void reverse(int* nums, int start, int end)
{
while (start < end)
{
swap(&nums[start], &nums[end]);
start += 1;
end -= 1;
}
}
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;
if( k ==0 || numsSize == 1)
{
return;
}
//交换高到低
reverse(nums, 0, k - 1);
//交换低到高
reverse(nums, k, numsSize - 1);
//交换全部
reverse(nums, 0, numsSize - 1);
}
5:数组形式的整数加法
本题的思路如下:
我们的函数参数有num数组,就是我们输入的数组,numsize是num数组的元素个数,k是加上去的值,returnsize是最后加上k后的数组
思考后我们就可以得出以下思路:
代码如下:
int* addToArrayForm(int* num, int numSize, int k, int* returnSize)
{
int i=0;
int sum=0;
int x=pow(10,numSize-1);
for(i=0;i<numSize;i++)
{
sum+=num[i]*x;
x=x/10;
}
int SUM=sum+k;
int count=0;
while(SUM)
{
count++;
SUM/=10;
}
int y=pow(10,count-1);
for(i=0;i<count;i++)
{
returnSize[i]=(sum+k)/y;
y/=10;
}
return returnSize;
}
好了,今天的分享到这里就结束了,感谢大家的支持!