66.加一
int* plusOne(int* digits, int digitsSize, int* returnSize)
{
int i = 0;
int update = 1;
int* temp = (int*)malloc(sizeof(int) * digitsSize);
int* tempbak = NULL;
*returnSize = digitsSize;
//判断是否需要进位
for (i = digitsSize - 1; i >= 0; i--)
{
if ((digits[i] + update) == 10)
{
temp[i] = 0;
update = 1;//updata为1,则需要进位
}
else
{
temp[i] = digits[i] + update;
update = 0;//为0,不进位,输出即可
}
}
//如果位数超过当前数组的最大值
if (update)
{
*returnSize = digitsSize + 1;
tempbak = (int*)malloc((sizeof(int)) * (digitsSize + 1));
tempbak[0] = 1;
for (i = 0; i < digitsSize; i++)
{
tempbak[i + 1] = temp[i];
}
free(temp);
return tempbak;
}
*returnSize = digitsSize;
return temp;
}
136.只出现一次的数字
利用 ^ ,巧思!
int singleNumber(int* nums, int numsSize)
{
int i = 0;
for (i = 1;i < numsSize;i++)//^ 找不同数字
{
nums[0] ^= nums[i];
}
return nums[0];
}
35.搜索插入位置
思路:二分法
int searchInsert(int* nums, int numsSize, int target)
{
int right = numsSize - 1;
int pos;
int left = 0, mid = 0;//二分法
if (target > nums[numsSize - 1])
{
return numsSize;
}
if (target < nums[0])
{
return 0;
}
while (left <= right)
{
mid = (left + right) / 2;
if (nums[mid] >= target)
{
pos = mid;
right = mid - 1;
}
else if (nums[mid] < target)
{
left = mid + 1;
}
}
return pos;
}
88.合并两个有序数组
方法一:直接合并后排序
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int i = 0;
for (i = 0;i != n;i++)//在nums1后面开辟n个空间,放nums2
{
nums1[m + i] = nums2[i];
}
qsort(nums1, nums1Size, sizeof(int), cmp);
}
方法二:双指针,从前向后遍历
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int p1 = 0, p2 = 0;
int sorted[m + n];
int cur;
while (p1 < m || p2 < n)
{
if (p1 == m) //当nums1结束了
{
cur = nums2[p2++];
}
else if (p2 == n) //当nums2结束了
{
cur = nums1[p1++];
}
else if (nums1[p1] < nums2[p2]) //比较排序
{
cur = nums1[p1++];
}
else
{
cur = nums2[p2++];
}
sorted[p1 + p2 - 1] = cur;
}
for (int i = 0; i != m + n; ++i)
{
nums1[i] = sorted[i];
}
}
方法三:逆向双指针(从后向前遍历)
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0)
{
if (p1 == -1)//遍历到第一个元素了
{
cur = nums2[p2--];
}
else if (p2 == -1)
{
cur = nums1[p1--];
}
else if (nums1[p1] > nums2[p2])
{
cur = nums1[p1--];
}
else
{
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}
💘 坚持每日刷题,YSE!!!