力扣(LeetCode)刷题,简单题(第14期)
目錄
第1題:配對交換
第2題:比較字符串最小字母出現頻次
第3題:交替位二進制
第4題:二進制間距
第5題:最后一塊石頭的重量
第6題:旋轉數字
第7題:十進制整數的反碼
第8題:連續子數組的最大和
第9題:有序數組中出現次數超過25%的元素
第10題:數組中字符串匹配
力扣(LeetCode)定期刷題,每期10道題,業務繁重的同志可以看看我分享的思路,不是最高效解決方案,只求互相提升。
第1題:配對交換
試題要求如下:
解答思路:
分別取出num的偶數位與奇數位
然后讓偶數位右移一位奇數位左移一位
讓移位后的偶數與奇數異或即可得最終結果
回答(C語言):
int exchangeBits(int num){int even_number = 0xaaaaaaaa; //1010 1010 ...... 取出偶數int uneven_number = 0x55555555; //0101 0101 ...... 取出奇數even_number = num & even_number;uneven_number = num & uneven_number;even_number = even_number >> 1;uneven_number = uneven_number << 1;return even_number | uneven_number;
}
運行效率如下所示:
第2題:比較字符串最小字母出現頻次
試題要求如下:
解答思路:
回答(C語言):
/*** Note: The returned array must be malloced, assume caller calls free().*/
#define NUM 26
int QureySmallWord (char *str, int *hash)
{memset(hash, 0, NUM * sizeof(int));int len = strlen(str);int res = 0;for (int i = 0; i < len; i++) {// 統計字符串中各個字符出現的頻次,已默認是字典序hash[str[i] - 'a']++;}for (int i = 0; i < NUM; i++) {// 獲取字符串中最小字母的出現頻次,即hash表中第一個非零值if (hash[i] > 0) {res = hash[i];break;}}//printf("res %d\n", res);return res;
}
int* numSmallerByFrequency(char ** queries, int queriesSize, char ** words, int wordsSize, int* returnSize){int *array_q = (int *)malloc(queriesSize * sizeof(int));int *array_w = (int *)malloc(wordsSize * sizeof(int));int *hash = (int *)malloc(NUM * sizeof(0));// queries各個字符串(按字典序比較)最小字母的出現頻次for (int i = 0; i < queriesSize; i++) {array_q[i] = QureySmallWord(queries[i], hash);}// words各個字符串(按字典序比較)最小字母的出現頻次for (int i = 0; i < wordsSize; i++) {array_w[i] = QureySmallWord(words[i], hash);}// 依次查找queries中字符串滿足f(queries[i])?<?f(W[0..j])的個數int *res = (int *)malloc(queriesSize * sizeof(int));int count = 0;for (int i = 0; i < queriesSize; i++) {int temp = 0;for (int j = 0; j < wordsSize; j++) {//printf("array_q[%d] %d array_w[%d] %d", i, array_q[i], j, array_w[j]);if (array_q[i] < array_w[j]) {temp++;}}res[count++] = temp;}*returnSize = count;return res;
}
運行效率如下所示:
第3題:交替位二進制
試題要求如下:
解答思路:
每次用 n&1 位運算取出最后一位,并與上一次取出的最后一位比較,一樣的話返回false。
回答(C語言):
bool hasAlternatingBits(int n){int pre = n & 1; n >>= 1;while (n != 0) {if ((n & 1) == pre) {return false;}pre = n & 1;n >>= 1;}return true;
}
運行效率如下所示:
第4題:二進制間距
試題要求如下:
解答思路:
1、利用 1 與數字N進行&運算檢查二進制第一位是否為1;
2、逐步將數字二進制值向右移動一位:N = N>>1;
3、N <= 0 時終止。
回答(C語言):
int binaryGap(int N){int distance = 0, max = 0,distanceon = 0; while (N > 0){if((N & 1) != 0){distanceon = 1;if(distance > max){max = distance;}distance = 0;}distance+=(distanceon);N = N >> 1;}return max;
}
運行效率如下所示:
第5題:最后一塊石頭的重量
試題要求如下:
解答思路:
1、5個石頭撞四次 6個石頭撞5次 N個石頭撞N-1次;
2、降序,撞前兩個。得到的新石頭放回去,空缺位置置0;
3、重復第二步;
4、最后剩下一個,就是答案。
回答(C語言):
int Cmp(const void* a, const void* b)
{return *(int*)b - *(int*)a;
}int lastStoneWeight(int* stones, int stonesSize)
{int time = stonesSize - 1;int buf[30] = {0};memcpy(buf, stones, stonesSize * sizeof(int));while (time > 0) {qsort(buf, 30, sizeof(int), Cmp);buf[0] -= buf[1];buf[1] = 0;time--;}return buf[0];
}
運行效率如下所示:
第6題:旋轉數字
試題要求如下:
解答思路:
遍歷從 1 到 N 的每個數字 X,判斷 X 是否為好數。如果 X 中存在 3、4、7 這樣的無效數字,則 X 不是一個好數。如果 X 中不存在 2、5、6、9 這樣的旋轉后會變成不同的數字,則 X 不是一個好數。否則,X 可以旋轉成一個不同的有效數字。
回答(C語言):
/*
* 函數功能:檢測是否是好數;是好數返回1,否則返回0
* 函數輸入:當前檢測的數num
* 函數返回值:0或1
*/
int CheckDigits(int num)
{int rest;int flag = 0;while(num > 0) {rest = num % 10;/* 遇到垃圾數直接返回0 */if (rest == 3 || rest == 4 || rest == 7) {return 0;}/* 遇到有可能存在的好數先標記一下 */if (rest == 2 || rest == 5 || rest == 6 || rest == 9) {flag = 1;}num = num / 10;}/* 如果不存在垃圾數,且有好數則統計加1 */if (flag == 1) {return 1;}return 0;
}
int rotatedDigits(int N){int ret = 0;for (int i = 1; i <= N; i++) {/* 逐個檢測,好數就加1 */ret += CheckDigits(i);}return ret;
}
運行效率如下所示:
第7題:十進制整數的反碼
試題要求如下:
解答思路:
舉個例子 6是110 那么他的反碼是他與111異或得到的001。所以找到比N大的每位都為1的數,與N進行異或。
回答(C語言):
int bitwiseComplement(int N){int num = 1;while(num < N){num = (num << 1) + 1;}return N ^ num;
}
運行效率如下所示:
第8題:連續子數組的最大和
試題要求如下:
解答思路:
動態規劃:
回答(C語言):
int maxSubArray(int* nums, int numsSize){int sum=nums[0],max=nums[0];for(int i=1;i<numsSize;i++){sum=(sum>0)?(sum+nums[i]):nums[i];max=(max>sum)?max:sum; }return max;
}
運行效率如下所示:
第9題:有序數組中出現次數超過25%的元素
試題要求如下:
回答(C語言):
int findSpecialInteger(int* arr, int arrSize){int i = 1,cou = 0;int temp = arr[0];while(i < arrSize){if(temp == arr[i]){cou++;if(cou*4 >= arrSize){break;}} else{cou = 0;}temp = arr[i];i++;}return temp;
}
運行效率如下所示:
第10題:數組中字符串匹配
試題要求如下:
解答思路:
C語言使用strstr庫函數來進行子字符串匹配。strstr(str1,str2) 函數用于判斷字符串str2是否是str1的子串。如果是,則該函數返回 str1字符串從 str2第一次出現的位置開始到 str1結尾的字符串;否則,返回NULL。
回答(C語言):
char ** stringMatching(char ** words, int wordsSize, int* returnSize){if ((words == NULL) || (wordsSize <= 0)) {*returnSize = 0;return NULL;}char** res = (char**)malloc(sizeof(char*) * wordsSize);int index = 0;for (int i = 0; i < wordsSize; i++) {for (int j = 0; j < wordsSize; j++) {if (i != j) {if (strstr(words[j], words[i])) {res[index] = (char*)malloc(sizeof(char) * (strlen(words[i]) + 1));memcpy(res[index], words[i], strlen(words[i]) + 1);index++;break;}}}}*returnSize = index;return res;}
運行效率如下所示:
總結
以上是生活随笔為你收集整理的力扣(LeetCode)刷题,简单题(第14期)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新冠疫情下,毕业照怎么拍?10行Pyth
- 下一篇: 4层板到12层板叠层经典设计方案