力扣 算法题

文章介绍了四道力扣(LeetCode)上的算法题,包括:66.加一,通过进位处理整数数组;136.只出现一次的数字,使用异或操作找出数组中只出现一次的数字;35.搜索插入位置,应用二分查找法找到目标值在排序数组中的合适位置;88.合并两个有序数组,提供了三种不同的合并方法。
摘要由CSDN通过智能技术生成

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!!!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值