力扣(LeetCode)刷题,简单题(第19期)
目錄
第1題:兩數之和2-輸入有序數組
第2題:換酒問題
第3題:山脈數組的峰頂索引
第4題:矩陣中的幸運數
第5題:去掉最低工資和最高工資后的工資平均值
第6題:非遞增順序的最小子序列
第7題:獨一無二的出現次數
第8題:反轉字符串中的單詞3
第9題:玩籌碼
第10題:字母大小寫全排列
力扣(LeetCode)定期刷題,每期10道題,業務繁重的同志可以看看我分享的思路,不是最高效解決方案,只求互相提升。
第1題:兩數之和2-輸入有序數組
試題要求如下:
回答(C語言):
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {int* ret = (int*)malloc(sizeof(int) * 2);*returnSize = 2;for (int i = 0; i < numbersSize; ++i) {int low = i + 1, high = numbersSize - 1;while (low <= high) {int mid = (high - low) / 2 + low;if (numbers[mid] == target - numbers[i]) {ret[0] = i + 1, ret[1] = mid + 1;return ret;} else if (numbers[mid] > target - numbers[i]) {high = mid - 1;} else {low = mid + 1;}}}ret[0] = -1, ret[1] = -1;return ret;
}
運行效率如下所示:
第2題:換酒問題
試題要求如下:
回答(C語言):
int numWaterBottles(int numBottles, int numExchange){int temp_numBottles = numBottles;int temp_num = 0;int temp_data = numBottles;while(temp_numBottles >= numExchange){temp_num = temp_numBottles/numExchange;temp_data += temp_num;temp_numBottles %= numExchange;temp_numBottles += temp_num;}return temp_data;
}
運行效率如下所示:
第3題:山脈數組的峰頂索引
試題要求如下:
回答(C語言):
int peakIndexInMountainArray(int* A, int ASize){int i=0;while(A[i]<A[i+1]) i++;return i;
}
運行效率如下所示:
第4題:矩陣中的幸運數
試題要求如下:
解答思路:
注意:題目有說數字都不同,那返回數組的size用行數或者列數都行。
第1次遍歷:存下每行的最小值到數組;
第2次遍歷:存下每列的最大值到數組;
第3次遍歷:滿足條件的加入要返回的結果數組。
回答(C語言):
int* luckyNumbers (int** matrix, int matrixSize, int* matrixColSize, int* returnSize){int i, j;int *ret = (int*)malloc(sizeof(int) * matrixSize);int minRow[matrixSize], maxCol[*matrixColSize];for (i = 0; i < matrixSize; i++) {minRow[i] = INT_MAX;for (j = 0; j < *matrixColSize; j++) {if (matrix[i][j] <= minRow[i]) {minRow[i] = matrix[i][j];}}}for (i = 0; i < *matrixColSize; i++) {maxCol[i] = INT_MIN;for (j = 0; j < matrixSize; j++) {if (matrix[j][i] >= maxCol[i]) {maxCol[i] = matrix[j][i];}}}*returnSize = 0;for (i = 0; i < matrixSize; i++) {for (j = 0; j < *matrixColSize; j++) {if (matrix[i][j] == minRow[i] && matrix[i][j] == maxCol[j]) {ret[*returnSize] = matrix[i][j];(*returnSize)++;}}}return ret;
}
運行效率如下所示:
第5題:去掉最低工資和最高工資后的工資平均值
試題要求如下:
解答思路:
一次遍歷找出最大max、最小min和總和sum,平均值average = (sum - max - min) / (salarySize - 2),沒有難度,只需要注意數據類型即可。
回答(C語言):
double average(int* salary, int salarySize){int max = salary[0];int min = salary[0];int sum = 0;double average = 0;if(salarySize <= 2)return 0;for(int i = 0; i < salarySize; i++){if(max < salary[i])max = salary[i];else if(min > salary[i])min = salary[i];sum += salary[i];}average = (double)(sum - max - min) / (double)(salarySize - 2);return average;
}
運行效率如下所示:
第6題:非遞增順序的最小子序列
試題要求如下:
回答(C語言):
/*** Note: The returned array must be malloced, assume caller calls free().*/
int cmp(int *a,int *b)
{return *b - *a;
}int* minSubsequence(int* nums, int numsSize, int* returnSize)
{qsort(nums,numsSize,sizeof(int),cmp);int left = 0,right = numsSize-1,leftsum = nums[left],rightsum = nums[right];while(left < right){if(leftsum > rightsum){right--;rightsum += nums[right];}else{left++;leftsum +=nums[left];}}*returnSize = left+1;return nums;
}
運行效率如下所示:
第7題:獨一無二的出現次數
試題要求如下:
回答(C語言):
bool uniqueOccurrences(int* arr, int arrSize){int result[2001];int result_nums[2001];memset(result, 0, 2001 * sizeof(int));memset(result_nums, 0, 2001 * sizeof(int));for(int i=0; i < arrSize;++i){if(arr[i] < 0){result[arr[i]*(-1)+1000] += 1;}else{result[arr[i]] += 1;} }for(int j=0;j < 2001 ;++j){if(result[j]>0){result_nums[result[j]] += 1;}if(result_nums[result[j]]>1){return false;}}return true;
}
運行效率如下所示:
第8題:反轉字符串中的單詞3
試題要求如下:
解答思路:
1、用i和j鎖定單詞的首尾;
2、用revers對s[i]到s[j]進行翻轉;
3、反復執行1、2直到遍歷完字符串結束。
回答(C語言):
void revers(char *s,int i,int j){char temp;while(i<j){temp=s[i];s[i]=s[j];s[j]=temp;i++;j--;}
}char * reverseWords(char * s){int i=0,j=0;int slen=strlen(s);for(int n=0;n<slen;n++){if(s[n]!=' '){i=n;n++;while(s[n]!='\0'&&s[n]!=' '){n++;}j=n-1;revers(s,i,j);}}return s;
}
運行效率如下所示:
第9題:玩籌碼
試題要求如下:
解答思路:
1、首先分析發現:偶數位置轉移到任意偶數位置代價為0,同理奇數位置轉移到任意奇數位置代價也為0;
2、其次,我們簡化籌碼位置,將所有偶數集中到2X位置,所有奇數集中到2X+1(或2X-1)位置;
3、要想代價最小,就是移動數量最小的集合。
4、綜合分析,發現實際上就是統計奇數和偶數的個數,取小者。
回答(C語言):
int minCostToMoveChips(int* chips, int chipsSize){int odd =0, even = 0;for(int i = 0; i < chipsSize; i++){if(chips[i]%2)odd++;elseeven++;}return (odd <= even)? odd: even;
}
運行效率如下所示:
第10題:字母大小寫全排列
試題要求如下:
回答(C語言):
/*** Note: The returned array must be malloced, assume caller calls free().*/
char ** letterCasePermutation(char * S, int* returnSize){int len = strlen(S), size = 1;char **res = (char**)malloc(sizeof(char*)*pow(2, len));*res = (char*)calloc(len + 1, sizeof(char));strcpy(*res, S);for (int i = 0; i < len; i++){if (S[i]>'9'){int k = size;for (int j = 0; j < k; j++){res[k + j] = (char*)calloc(len + 1, sizeof(char));strcpy(res[k + j], res[j]);res[k + j][i] = S[i] < 'a' ? S[i] + 32 : S[i] - 32;size++;}}}*returnSize = size;return res;
}
運行效率如下所示:
總結
以上是生活随笔為你收集整理的力扣(LeetCode)刷题,简单题(第19期)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言:十六进制(HEX)和浮点类型(f
- 下一篇: GitHub开源的超逼真俄罗斯方块游戏