小言_互联网的博客

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

368人阅读  评论(0)

目录

第1题:二叉搜索树的范围和

第2题:缀点成线

第3题:删除回文子序列

第4题:奇数值单元格的数目

第5题:重新排列字符串

第6题:方阵中战斗力最弱的 K 行

第7题:检查整数及其两倍数是否存在

第8题:统计最大组的数目

第9题:存在连续三个奇数的数组

第10题:替换所有的问号


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

第1题:二叉搜索树的范围和

试题要求如下:

 

回答(C语言):


  
  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * struct TreeNode *left;
  6. * struct TreeNode *right;
  7. * };
  8. */
  9. int rangeSumBST(struct TreeNode* root, int L, int R){
  10. if(root == NULL)
  11. return 0;
  12. int sum = rangeSumBST(root ->left,L,R) + rangeSumBST (root -> right,L,R);
  13. if(root ->val <= R && root ->val >= L)
  14. sum += root ->val;
  15. return sum;
  16. }

运行效率如下所示:


第2题:缀点成线

试题要求如下:

解答思路:

直线的两点式方程(y-y2)/(y1-y2) = (x-x2)/(x1-x2),取前两个点组成直线,判断后面的点是否在直线上。

回答(C语言):


  
  1. bool checkStraightLine(int** coordinates, int coordinatesSize, int* coordinatesColSize){
  2. if(coordinatesSize== 2) return true;
  3. for( int i= 2;i<coordinatesSize;i++)
  4. {
  5. if(
  6. (coordinates[i][ 0]-coordinates[ 1][ 0])*(coordinates[ 0][ 1]-coordinates[ 1][ 1])!=(coordinates[i][ 1]-coordinates[ 1][ 1])*(coordinates[ 0][ 0]-coordinates[ 1][ 0])
  7. )
  8. {
  9. return false;
  10. }
  11. }
  12. return true;
  13. }

运行效率如下所示:


第3题:删除回文子序列

试题要求如下:

解答思路:

因为是删除回文子序列(就是顺序不变的情况下,可以算隔开的字符),所以只有三种情况。

1、当字符串为空时,返回0。

2、当整字符串为回文序列时,删一次,返回1。

3、当整字符串不为回文序列时,最多是删除两次,一次删除所有a,一次删除所有b,返回2。

回答(C语言):


  
  1. int removePalindromeSub(char * s){
  2. if( strlen(s) == 0)
  3. return 0;
  4. int low = 0,high = strlen(s) -1;
  5. while(low < high)
  6. if(s[low++] != s[high--])
  7. return 2;
  8. return 1;
  9. }

运行效率如下所示:


第4题:奇数值单元格的数目

试题要求如下:

回答(C语言):


  
  1. int oddCells(int n, int m, int** indices, int indicesSize, int* indicesColSize){
  2. int arr[n][m];
  3. *indicesColSize= 2;
  4. int count= 0;
  5. for( int i= 0;i<n;i++){ //数组初始化
  6. for( int j= 0;j<m;j++){
  7. arr[i][j]= 0;
  8. }
  9. }
  10. for( int i= 0;i<indicesSize;i++){ //横向加1
  11. for( int j= 0;j<m;j++){
  12. arr[indices[i][ 0]][j]++;
  13. }
  14. }
  15. for( int i= 0;i<indicesSize;i++){ //纵向加1
  16. for( int j= 0;j<n;j++){
  17. arr[j][indices[i][ 1]]++;
  18. }
  19. }
  20. for( int i= 0;i<n;i++){ //遍历奇数
  21. for( int j= 0;j<m;j++){
  22. if(arr[i][j]% 2== 1)count++;
  23. }
  24. }
  25. return count;
  26. }

运行效率如下所示:


第5题:重新排列字符串

试题要求如下:

回答(C语言):


  
  1. char * restoreString(char * s, int* indices, int indicesSize){
  2. char* temp = ( char*) malloc( sizeof( char)*(indicesSize+ 1));
  3. for( int i= 0; i<indicesSize; i++)
  4. temp[indices[i]] = s[i];
  5. temp[indicesSize] = '\0';
  6. return temp;
  7. }

运行效率如下所示:


第6题:方阵中战斗力最弱的 K 行

试题要求如下:

回答(C语言):


  
  1. /**
  2. * Note: The returned array must be malloced, assume caller calls free().
  3. */
  4. int cmp(const void *a, const void *b){
  5. return *( int*)a - *( int*)b;
  6. }
  7. int* kWeakestRows(int** mat, int matSize, int* matColSize, int k, int* returnSize){
  8. int *result = ( int*) malloc(matSize * sizeof( int));
  9. *returnSize = k;
  10. int *res = ( int*) malloc(k * sizeof( int));
  11. for( int i = 0; i < matSize; i++){
  12. //统计1的个数
  13. result[i] = 0;
  14. for( int j = 0; j < matColSize[i]; j++){
  15. if(mat[i][j] == 1){
  16. result[i] += matSize;
  17. } else{
  18. break;
  19. }
  20. }
  21. result[i] += i;
  22. }
  23. qsort(result, matSize, sizeof(result[ 0]), cmp);
  24. for( int i = 0; i < k; i++){
  25. res[i] = result[i] % matSize;
  26. }
  27. return res;
  28. }

运行效率如下所示:


第7题:检查整数及其两倍数是否存在

试题要求如下:

解答思路:

暴力破解。遍历数组,找出数组中的偶数,只有偶数才能是其它数的两倍,然后在这个条件下,给这个偶数除以2,以temp变量保存,然后再次遍历数组,找到是否数组中有值与temp相等。

回答(C语言):


  
  1. bool checkIfExist(int* arr, int arrSize){
  2. int temp;
  3. for( int i = 0;i<arrSize;i++){
  4. if(arr[i]% 2 == 0){
  5. temp = arr[i]/ 2;
  6. for( int j= 0;j<arrSize;j++){
  7. if(temp == arr[j] && i!=j)
  8. return true;
  9. }
  10. }
  11. }
  12. return false;
  13. }

运行效率如下所示:


第8题:统计最大组的数目

试题要求如下:

解答思路:

1、定义数组,并依据求出某个和值出现的次数(按照题意,定义46个数组大小就可以了);

2、一次遍历求得的数组,统计键值最大时出现的次数。

回答(C语言):


  
  1. #define MAXSIZE 100
  2. int IntergerSum(int n) {
  3. int res = 0;
  4. while (n) {
  5. res += n % 10;
  6. n = n / 10;
  7. }
  8. return res;
  9. }
  10. int countLargestGroup(int n){
  11. int arr[MAXSIZE] = { 0};
  12. int cnt, val;
  13. for ( int i = 1; i <= n; i++) {
  14. arr[IntergerSum(i)]++;
  15. }
  16. val = arr[ 1];
  17. cnt = 1;
  18. for ( int i = 2; i < MAXSIZE; i++) {
  19. if (arr[i] == val) {
  20. cnt++;
  21. } else if (arr[i] > val) {
  22. val = arr[i];
  23. cnt = 1;
  24. }
  25. }
  26. return cnt;
  27. }

运行效率如下所示:


第9题:存在连续三个奇数的数组

试题要求如下:

回答(C语言):


  
  1. bool threeConsecutiveOdds(int* arr, int arrSize){
  2. for( int i= 0;i<arrSize -2;i++){
  3. if(arr[i]% 2== 1&&arr[i+ 1]% 2== 1&&arr[i+ 2]% 2== 1)
  4. return true;
  5. }
  6. return false;
  7. }

运行效率如下所示:


第10题:替换所有的问号

试题要求如下:

解答思路:

遍历字符串,如果当前字符为'?',用'a'开始尝试,直到找到一个字符,满足前后字符都与当前字符不同,进行替换。

回答(C语言):


  
  1. char * modifyString( char * s ){
  2. for( int i = 0 ; s[i] != '\0' ; i++ ) {
  3. if( s[i] == '?' ) {
  4. char ch = 'a';
  5. while(( i > 0 && ch == s[ i - 1 ]) || (s[ i + 1 ] != '\0' && ch == s[ i + 1 ])) {
  6. ch++;
  7. }
  8. s[i] = ch;
  9. }
  10. }
  11. return s;
  12. }

运行效率如下所示:


转载:https://blog.csdn.net/m0_38106923/article/details/108635316
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场