力扣(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++; else even++; } 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;}
复制代码
运行效率如下所示:
评论