力扣 算法题
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;
}
感谢阅读!
👊👊👊