力扣 算法题

文章列举了多个LeetCode上的算法题目,包括字符串中第一个匹配项的下标查找,判断有效完全平方数的两种方法,寻找只出现一次的数字,计算二进制表示中质数个计算置位,宝石与石头问题,托普利茨矩阵的识别,错误集合的分析以及自除数的判断。这些题目涉及字符串处理、数学逻辑和数组操作等编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

28. 找出字符串中第一个匹配项的下标

在这里插入图片描述

int strStr(char* haystack, char* needle)
{
    int n = strlen(haystack);
    int m = strlen(needle);
    int i = 0;
    int j = 0;
    while (i + j < n && j < m) //因为haystack[i+j],所以i+j<n
    {
        if (haystack[i + j] == needle[j])
        {
            j++;
        }
        else
        {
            j = 0;
            i++;
        }
    }
    if (j == m)
    {
        return i;
    }
    return -1;
}

367. 有效的完全平方数

在这里插入图片描述

法一:(二分法)

bool isPerfectSquare(int num)
{
    int left = 0, right = num;
    while (left <= right)
    {
        int mid = left + (right - left) / 2;//或int mid = left + (right - left)>>2;
        long square = (long)mid * mid;//使用(long),不然会越界;
        if (square < num)
            left = mid + 1;
        else if (square > num)
            right = mid - 1;
        else
            return true;
    }
    return false;
}

法二:(巧思)

在这里插入图片描述

bool isPerfectSquare(int num)
{
    if (num == 0)
    {
        return false;
    }
    int i = 1;
    while (num > 0)
    {
        num -= i;
        i += 2;//则i:1,3,5,7
    }
    return num == 0 ? true : false;

}

260. 只出现一次的数字III

在这里插入图片描述

int* singleNumber(int* nums, int numsSize, int* returnSize)
{
    int* ans = calloc(2, sizeof(int));
    //1.所有数异或
    int ret = 0;
    int i = 0;
    for (i = 0;i < numsSize;i++)
    {
        ret ^= nums[i];
    }
    //2.计算ret的二进制中哪一位是1
    int pos = 0;
    for (i = 0;i < 32;i++)
    {
        if (((ret >> i) & 1) == 1)
        {
            pos = i;
            break;
        }
    }
    //3.分组异或
    for (i = 0;i < numsSize;i++)
    {
        if (((nums[i] >> pos) & 1) == 1)
        {
            ans[0] ^= nums[i];
        }
        else
        {
            ans[1] ^= nums[i];
        }
    }
    *returnSize = 2;
    return ans;

}

762. 二进制表示中质数个计算置位

在这里插入图片描述

bool isPrime(int x)
{
    int count = 0;
    while (x)
    {
        if (x % 2 == 1)
        {
            count++;
        }
        x = x >> 1;//x/2,得到二进制位中每一位
    }
    if (count == 1)
    {
        return false;
    }
    else
    {
        for (int i = 2;i < count;i++)//判断count是否为质数
        {
            if (count % i == 0)
            {
                return false;
            }
        }
    }
    return true;
}

int countPrimeSetBits(int left, int right)
{
    int count = 0;
    for (int x = left;x <= right;x++)
    {
        if (isPrime(x))
            count++;
    }
    return count;

}

771. 宝石与石头

在这里插入图片描述

int numJewelsInStones(char* jewels, char* stones)
{
    int len1 = strlen(jewels);
    int len2 = strlen(stones);
    int count = 0;
    for (int i = 0;i < len2;i++)//在石头中遍历宝石!
    {
        for (int j = 0;j < len1;j++)
        {
            if (stones[i] == jewels[j])
            {
                count++;
                break;
            }

        }
    }
    return count;

}

766. 托普利茨矩阵

在这里插入图片描述

bool isToeplitzMatrix(int** matrix, int matrixSize, int* matrixColSize)
{
    int m = matrixSize;
        int n = matrixColSize[0];//第一组元素个数
    for (int i = 1; i < m; i++)
    {
        for (int j = 1; j < n; j++)
        {
            if (matrix[i][j] != matrix[i - 1][j - 1])
            {
                return false;
            }
        }
    }
    return true;
}

645. 错误的集合

在这里插入图片描述

int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
    int arr[10002] = { 0 };
    int* res = malloc(sizeof(int) * 2);

    for (int i = 0; i < numsSize; ++i)
    {
        arr[nums[i]]++; //关键
        if (arr[nums[i]] == 2) //通过元素访问下标
        {
            res[0] = nums[i];
        }
    }
    for (int i = 0; i < numsSize; ++i)
    {
        if (arr[i + 1] == 0)  //arr[i+1]==0,此时,i+1是nums[i],==0是出现的次数
        {
            res[1] = i + 1;
        }
    }
    *returnSize = 2;
    return res;
}

728. 自除数

在这里插入图片描述

int IsSelfDividing(int n)
{
    int tmp = n;
    while (tmp > 0)
    {
        int d = tmp % 10;
        if (d == 0 || n % d != 0)
        {
            return false;
        }
        tmp /= 10;
    }
    return true;
}

int* selfDividingNumbers(int left, int right, int* returnSize)
{
    int* arr = (int*)malloc(sizeof(int) * (right - left + 1));
    int k = 0;
    for (int i = left;i <= right;i++)
    {
        if (IsSelfDividing(i))
        {
            arr[k] = i;
            k++;
        }
    }
    *returnSize = k;
    return arr;
}

感谢阅读!

👊👊👊

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值