力扣(LeetCode)刷题,简单题(第14期)

目录

第1题:配对交换

第2题:比较字符串最小字母出现频次

第3题:交替位二进制

第4题:二进制间距

第5题:最后一块石头的重量

第6题:旋转数字

第7题:十进制整数的反码

第8题:连续子数组的最大和

第9题:有序数组中出现次数超过25%的元素

第10题:数组中字符串匹配


力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。

第1题:配对交换

试题要求如下:

解答思路:

分别取出num的偶数位与奇数位

然后让偶数位右移一位奇数位左移一位

让移位后的偶数与奇数异或即可得最终结果

回答(C语言):


  
  1. int exchangeBits(int num){
  2. int even_number = 0xaaaaaaaa; //1010 1010 ...... 取出偶数
  3. int uneven_number = 0x55555555; //0101 0101 ...... 取出奇数
  4. even_number = num & even_number;
  5. uneven_number = num & uneven_number;
  6. even_number = even_number >> 1;
  7. uneven_number = uneven_number << 1;
  8. return even_number | uneven_number;
  9. }

运行效率如下所示:


第2题:比较字符串最小字母出现频次

试题要求如下:

解答思路:

回答(C语言):


  
  1. /**
  2. * Note: The returned array must be malloced, assume caller calls free().
  3. */
  4. #define NUM 26
  5. int QureySmallWord (char *str, int *hash)
  6. {
  7. memset(hash, 0, NUM * sizeof(int));
  8. int len = strlen(str);
  9. int res = 0;
  10. for (int i = 0; i < len; i++) {
  11. // 统计字符串中各个字符出现的频次,已默认是字典序
  12. hash[str[i] - 'a']++;
  13. }
  14. for (int i = 0; i < NUM; i++) {
  15. // 获取字符串中最小字母的出现频次,即hash表中第一个非零值
  16. if (hash[i] > 0) {
  17. res = hash[i];
  18. break;
  19. }
  20. }
  21. //printf("res %d\n", res);
  22. return res;
  23. }
  24. int* numSmallerByFrequency(char ** queries, int queriesSize, char ** words, int wordsSize, int* returnSize){
  25. int *array_q = (int *)malloc(queriesSize * sizeof(int));
  26. int *array_w = (int *)malloc(wordsSize * sizeof(int));
  27. int *hash = (int *)malloc(NUM * sizeof(0));
  28. // queries各个字符串(按字典序比较)最小字母的出现频次
  29. for (int i = 0; i < queriesSize; i++) {
  30. array_q[i] = QureySmallWord(queries[i], hash);
  31. }
  32. // words各个字符串(按字典序比较)最小字母的出现频次
  33. for (int i = 0; i < wordsSize; i++) {
  34. array_w[i] = QureySmallWord(words[i], hash);
  35. }
  36. // 依次查找queries中字符串满足f(queries[i]) < f(W[0..j])的个数
  37. int *res = (int *)malloc(queriesSize * sizeof(int));
  38. int count = 0;
  39. for (int i = 0; i < queriesSize; i++) {
  40. int temp = 0;
  41. for (int j = 0; j < wordsSize; j++) {
  42. //printf("array_q[%d] %d array_w[%d] %d", i, array_q[i], j, array_w[j]);
  43. if (array_q[i] < array_w[j]) {
  44. temp++;
  45. }
  46. }
  47. res[count++] = temp;
  48. }
  49. *returnSize = count;
  50. return res;
  51. }

运行效率如下所示:


第3题:交替位二进制

试题要求如下:

解答思路:

每次用 n&1 位运算取出最后一位,并与上一次取出的最后一位比较,一样的话返回false。

回答(C语言):


  
  1. bool hasAlternatingBits(int n){
  2. int pre = n & 1;
  3. n >>= 1;
  4. while (n != 0) {
  5. if ((n & 1) == pre) {
  6. return false;
  7. }
  8. pre = n & 1;
  9. n >>= 1;
  10. }
  11. return true;
  12. }

运行效率如下所示:


第4题:二进制间距

试题要求如下:

解答思路:

1、利用 1 与数字N进行&运算检查二进制第一位是否为1;

2、逐步将数字二进制值向右移动一位:N = N>>1;

3、N <= 0 时终止。

回答(C语言):


  
  1. int binaryGap(int N){
  2. int distance = 0, max = 0,distanceon = 0;
  3. while (N > 0){
  4. if((N & 1) != 0){
  5. distanceon = 1;
  6. if(distance > max){
  7. max = distance;
  8. }
  9. distance = 0;
  10. }
  11. distance+=(distanceon);
  12. N = N >> 1;
  13. }
  14. return max;
  15. }

运行效率如下所示:


第5题:最后一块石头的重量

试题要求如下:

解答思路:

1、5个石头撞四次 6个石头撞5次 N个石头撞N-1次;

2、降序,撞前两个。得到的新石头放回去,空缺位置置0;

3、重复第二步;

4、最后剩下一个,就是答案。

回答(C语言):


  
  1. int Cmp(const void* a, const void* b)
  2. {
  3. return *(int*)b - *(int*)a;
  4. }
  5. int lastStoneWeight(int* stones, int stonesSize)
  6. {
  7. int time = stonesSize - 1;
  8. int buf[30] = {0};
  9. memcpy(buf, stones, stonesSize * sizeof(int));
  10. while (time > 0) {
  11. qsort(buf, 30, sizeof(int), Cmp);
  12. buf[0] -= buf[1];
  13. buf[1] = 0;
  14. time--;
  15. }
  16. return buf[0];
  17. }

运行效率如下所示:


第6题:旋转数字

试题要求如下:

解答思路:

遍历从 1 到 N 的每个数字 X,判断 X 是否为好数。如果 X 中存在 3、4、7 这样的无效数字,则 X 不是一个好数。如果 X 中不存在 2、5、6、9 这样的旋转后会变成不同的数字,则 X 不是一个好数。否则,X 可以旋转成一个不同的有效数字。

回答(C语言):


  
  1. /*
  2. * 函数功能:检测是否是好数;是好数返回1,否则返回0
  3. * 函数输入:当前检测的数num
  4. * 函数返回值:0或1
  5. */
  6. int CheckDigits(int num)
  7. {
  8. int rest;
  9. int flag = 0;
  10. while(num > 0) {
  11. rest = num % 10;
  12. /* 遇到垃圾数直接返回0 */
  13. if (rest == 3 || rest == 4 || rest == 7) {
  14. return 0;
  15. }
  16. /* 遇到有可能存在的好数先标记一下 */
  17. if (rest == 2 || rest == 5 || rest == 6 || rest == 9) {
  18. flag = 1;
  19. }
  20. num = num / 10;
  21. }
  22. /* 如果不存在垃圾数,且有好数则统计加1 */
  23. if (flag == 1) {
  24. return 1;
  25. }
  26. return 0;
  27. }
  28. int rotatedDigits(int N){
  29. int ret = 0;
  30. for (int i = 1; i <= N; i++) {
  31. /* 逐个检测,好数就加1 */
  32. ret += CheckDigits(i);
  33. }
  34. return ret;
  35. }

运行效率如下所示:


第7题:十进制整数的反码

试题要求如下:

解答思路:

举个例子 6是110 那么他的反码是他与111异或得到的001。所以找到比N大的每位都为1的数,与N进行异或。

回答(C语言):


  
  1. int bitwiseComplement(int N){
  2. int num = 1;
  3. while(num < N){
  4. num = (num << 1) + 1;
  5. }
  6. return N ^ num;
  7. }

运行效率如下所示:


第8题:连续子数组的最大和

试题要求如下:

解答思路:

动态规划:

回答(C语言):


  
  1. int maxSubArray(int* nums, int numsSize){
  2. int sum=nums[0],max=nums[0];
  3. for(int i=1;i<numsSize;i++)
  4. {
  5. sum=(sum>0)?(sum+nums[i]):nums[i];
  6. max=(max>sum)?max:sum;
  7. }
  8. return max;
  9. }

运行效率如下所示:


第9题:有序数组中出现次数超过25%的元素

试题要求如下:

回答(C语言):


  
  1. int findSpecialInteger(int* arr, int arrSize){
  2. int i = 1,cou = 0;
  3. int temp = arr[0];
  4. while(i < arrSize){
  5. if(temp == arr[i]){
  6. cou++;
  7. if(cou*4 >= arrSize){
  8. break;
  9. }
  10. }
  11. else{
  12. cou = 0;
  13. }
  14. temp = arr[i];
  15. i++;
  16. }
  17. return temp;
  18. }

运行效率如下所示:


第10题:数组中字符串匹配

试题要求如下:

解答思路:

C语言使用strstr库函数来进行子字符串匹配。strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。

回答(C语言):


  
  1. char ** stringMatching(char ** words, int wordsSize, int* returnSize){
  2. if ((words == NULL) || (wordsSize <= 0)) {
  3. *returnSize = 0;
  4. return NULL;
  5. }
  6. char** res = (char**)malloc(sizeof(char*) * wordsSize);
  7. int index = 0;
  8. for (int i = 0; i < wordsSize; i++) {
  9. for (int j = 0; j < wordsSize; j++) {
  10. if (i != j) {
  11. if (strstr(words[j], words[i])) {
  12. res[index] = (char*)malloc(sizeof(char) * (strlen(words[i]) + 1));
  13. memcpy(res[index], words[i], strlen(words[i]) + 1);
  14. index++;
  15. break;
  16. }
  17. }
  18. }
  19. }
  20. *returnSize = index;
  21. return res;
  22. }

运行效率如下所示:

文章来源: handsome-man.blog.csdn.net,作者:不脱发的程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:handsome-man.blog.csdn.net/article/details/106488259

(完)