力扣(LeetCode)刷题,简单题(第23期)
目錄
第1題:整數(shù)轉(zhuǎn)換
第2題:重復(fù)的子字符串
第3題:范圍求和2
第4題:反轉(zhuǎn)數(shù)位
第5題:數(shù)字轉(zhuǎn)換為十六進(jìn)制
第6題:比較含退格的字符
第7題:三個(gè)數(shù)的最大乘積
第8題:珠璣妙算
第9題:旋轉(zhuǎn)字符串
第10題:較大分組的位置
力扣(LeetCode)定期刷題,每期10道題,業(yè)務(wù)繁重的同志可以看看我分享的思路,不是最高效解決方案,只求互相提升。
第1題:整數(shù)轉(zhuǎn)換
試題要求如下:
解答思路:
異或操作。
回答(C語(yǔ)言):
int convertInteger(int A, int B){int res=0;unsigned int tmp = A^B;while(tmp){if(tmp&1==1){res=res+1;}tmp>>=1;}return res;
}
運(yùn)行效率如下所示:
第2題:重復(fù)的子字符串
試題要求如下:
解答思路:
回答(C語(yǔ)言):
bool repeatedSubstringPattern(char* s) {int n = strlen(s);for (int i = 1; i * 2 <= n; ++i) {if (n % i == 0) {bool match = true;for (int j = i; j < n; ++j) {if (s[j] != s[j - i]) {match = false;break;}}if (match) {return true;}}}return false;
}
運(yùn)行效率如下所示:
第3題:范圍求和2
試題要求如下:
解答思路:
這題最簡(jiǎn)單的做法就是去找所給二維矩陣的第一列了和第二列最小的數(shù),因?yàn)閿?shù)組每行的兩個(gè)數(shù)都可以劃分一個(gè)矩形,最后和最大的數(shù),必定是共同的重疊部分,所以只需找數(shù)組每列的最小值,乘積為所求。
回答(C語(yǔ)言):
int maxCount(int m, int n, int** ops, int opsSize, int* opsColSize){int min_c = m, min_r = n;for(int i = 0;i < opsSize;i++){if(ops[i][0] < min_c){min_c = ops[i][0];}if(ops[i][1] < min_r){min_r = ops[i][1];}}return min_c * min_r;
}
運(yùn)行效率如下所示:
第4題:反轉(zhuǎn)數(shù)位
試題要求如下:
回答(C語(yǔ)言):
void toBit(int num, int *val) {int i = 0;while(num) {val[i] = num & 1;num >>= 1;i++;}
}int reverseBits(int num){int val[32] = {0};toBit(num, val);int count = 0;int countPre = 0;int max = 0;for (int i = 0; i < 32; i++) {if (val[i] == 1) {count++;} else {if (countPre + count + 1 > max) {max = countPre + count + 1;}countPre = count;count = 0;}}return max;
}
運(yùn)行效率如下所示:
第5題:數(shù)字轉(zhuǎn)換為十六進(jìn)制
試題要求如下:
解答思路:
取余、除以16(0X0F),裝入數(shù)組,再反轉(zhuǎn)。
回答(C語(yǔ)言):
char g_stack[16 + 1] = {0};
void swap(char *a, char *b) {char t = *a; *a = *b; *b = t; }char * toHex(int num) {int top = -1;unsigned int n = num;char index[] = "0123456789abcdef";// 這里用do...while()而不是while(),能直接覆蓋num為0的情況do {g_stack[++top] = index[n % 16];n /= 16;} while (n != 0);g_stack[top + 1] = '\0';int lo = 0, hi = top;while (lo < hi) {swap(&g_stack[lo++], &g_stack[hi--]);}return g_stack;
}
運(yùn)行效率如下所示:
第6題:比較含退格的字符
試題要求如下:
解答思路:
采用雙指針,遇到‘#’,下標(biāo)減一,刪除前一個(gè)字符;其他字符依次增加下標(biāo)計(jì)數(shù);得到新的字符串,然后就是字符串是否相同對(duì)比。
回答(C語(yǔ)言):
int deletebackspace(char *str,int size){if(str==NULL||size==0){return 0;}int index = 0;for(int i=0;i<size;i++){if(str[i] != '#'){str[index++] = str[i];}else{if(index>0){index--;}}}return index;
}bool backspaceCompare(char * S, char * T){int slen = deletebackspace(S,strlen(S));int tlen = deletebackspace(T,strlen(T));if(slen != tlen){return false;}else{for(int i=0;i<slen;i++){if(S[i] != T[i]){return false;}}return true;}
}
運(yùn)行效率如下所示:
第7題:三個(gè)數(shù)的最大乘積
試題要求如下:
解答思路:
我們將數(shù)組進(jìn)行升序排序,如果數(shù)組中所有的元素都是非負(fù)數(shù),那么答案即為最后三個(gè)元素的乘積。
如果數(shù)組中出現(xiàn)了負(fù)數(shù),那么我們還需要考慮乘積中包含負(fù)數(shù)的情況,顯然選擇最小的兩個(gè)負(fù)數(shù)和最大的一個(gè)正數(shù)是最優(yōu)的,即為前兩個(gè)元素與最后一個(gè)元素的乘積。
回答(C語(yǔ)言):
int Compare(const void* a, const void* b)
{return *(int*)a - *(int*)b;
}int Max(int a, int b)
{return a > b ? a : b;
}int maximumProduct(int* nums, int numsSize){qsort(nums, numsSize, sizeof(int), Compare);return Max(nums[numsSize - 1] * nums[numsSize -2] * nums[numsSize - 3], nums[numsSize - 1] * nums[0] * nums[1]);
}
運(yùn)行效率如下所示:
第8題:珠璣妙算
試題要求如下:
回答(C語(yǔ)言):
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* masterMind(char* solution, char* guess, int* returnSize){returnSize[0] = 2;int dict[26] = {0}, *res = (int *)malloc (sizeof (int) * 2);res[0] = res[1] = 0;for (int i = 0; solution[i] != '\0'; ++i) {dict[solution[i] -'A']++;if (guess[i] == solution[i]) res[0]++;}for (int i = 0; solution[i] != '\0'; ++i) {if (dict[guess[i] - 'A']) {dict[guess[i] - 'A']--;res[1]++;}}res[1] -= res[0];return res;
}
運(yùn)行效率如下所示:
第9題:旋轉(zhuǎn)字符串
試題要求如下:
回答(C語(yǔ)言):
bool rotateString(char * A, char * B){int len = strlen(A);if(strlen(B) != len) return false;if(strcmp(A, B) == 0) return true;for(int i = 0; i < len; i++) {if(A[0] == B[i]) {int j;for(j=0; j < len; j++) {if(j<i && A[j+len-i] != B[j]) {break;}if(j >= i && A[j-i] != B[j]) {break;}}if(j == len) {return true;}}}return false;
}
運(yùn)行效率如下所示:
第10題:較大分組的位置
試題要求如下:
回答(C語(yǔ)言):
/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/
int** largeGroupPositions(char * S, int* returnSize, int** returnColumnSizes){int size = 0;int len =strlen(S);if(len < 3){*returnSize = 0;** returnColumnSizes = 0;return 0;}int ** res = (int **)malloc(len * sizeof(int *));for(int i=0;i<len;i++){res[i] = (int *)calloc(2,sizeof(int));}for(int i=0; i<len-2 ; i++){if( S[i] == S[i+1] && S[i] == S[i+2]){(*returnColumnSizes)[size] = 2;char temp = S[i];res[size][0]=i;i+=3;while(temp == S[i] && i<len) i++;res[size][1]=--i; //由于循環(huán)體內(nèi)有i++,此處的S[i]已經(jīng)是新值的起始點(diǎn),為了一致,應(yīng)退回1size++; }}*returnSize = size;return res;
}
運(yùn)行效率如下所示:
總結(jié)
以上是生活随笔為你收集整理的力扣(LeetCode)刷题,简单题(第23期)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一文搞懂TCP的三次握手和四次挥手
- 下一篇: PT100热电阻校准模块设计