目录

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

​第2题:缀点成线​

​第3题:删除回文子序列​

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

​第5题:重新排列字符串​

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

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

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

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

​第10题:替换所有的问号​


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

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

试题要求如下:

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


回答(C语言):

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/

int rangeSumBST(struct TreeNode* root, int L, int R){
if(root == NULL)
return 0;

int sum = rangeSumBST(root ->left,L,R) + rangeSumBST (root -> right,L,R);

if(root ->val <= R && root ->val >= L)
sum += root ->val;

return sum;
}

运行效率如下所示:

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


第2题:​​缀点成线​​

试题要求如下:

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

解答思路:

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

回答(C语言):

bool checkStraightLine(int** coordinates, int coordinatesSize, int* coordinatesColSize){
if(coordinatesSize==2) return true;

for(int i=2;i<coordinatesSize;i++)
{
if(
(coordinates[i][0]-coordinates[1][0])*(coordinates[0][1]-coordinates[1][1])!=(coordinates[i][1]-coordinates[1][1])*(coordinates[0][0]-coordinates[1][0])
)
{
return false;
}
}

return true;
}

运行效率如下所示:

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


第3题:​​删除回文子序列​​

试题要求如下:

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

解答思路:

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

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

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

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

回答(C语言):

int removePalindromeSub(char * s){
if(strlen(s) == 0)
return 0;

int low = 0,high = strlen(s)-1;

while(low < high)
if(s[low++] != s[high--])
return 2;

return 1;
}

运行效率如下所示:

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


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

试题要求如下:

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

回答(C语言):

int oddCells(int n, int m, int** indices, int indicesSize, int* indicesColSize){
int arr[n][m];
*indicesColSize=2;
int count=0;

for(int i=0;i<n;i++){//数组初始化
for(int j=0;j<m;j++){
arr[i][j]=0;
}
}

for(int i=0;i<indicesSize;i++){//横向加1
for(int j=0;j<m;j++){
arr[indices[i][0]][j]++;
}
}

for(int i=0;i<indicesSize;i++){//纵向加1
for(int j=0;j<n;j++){
arr[j][indices[i][1]]++;
}
}

for(int i=0;i<n;i++){//遍历奇数
for(int j=0;j<m;j++){
if(arr[i][j]%2==1)count++;
}
}

return count;
}

运行效率如下所示:

力扣(LeetCode)刷题,简单题(第25期)_提升编程能力_08


第5题:​​重新排列字符串​​

试题要求如下:

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

回答(C语言):

char * restoreString(char * s, int* indices, int indicesSize){
char* temp = (char*)malloc(sizeof(char)*(indicesSize+1));

for(int i=0; i<indicesSize; i++)
temp[indices[i]] = s[i];

temp[indicesSize] = '\0';

return temp;
}

运行效率如下所示:

力扣(LeetCode)刷题,简单题(第25期)_提升编程能力_10


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

试题要求如下:

力扣(LeetCode)刷题,简单题(第25期)_提升编程能力_11

回答(C语言):

/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int cmp(const void *a, const void *b){
return *(int*)a - *(int*)b;
}

int* kWeakestRows(int** mat, int matSize, int* matColSize, int k, int* returnSize){
int *result = (int*)malloc(matSize * sizeof(int));
*returnSize = k;
int *res = (int*)malloc(k * sizeof(int));

for(int i = 0; i < matSize; i++){
//统计1的个数
result[i] = 0;
for(int j = 0; j < matColSize[i]; j++){

if(mat[i][j] == 1){
result[i] += matSize;
}else{
break;
}
}
result[i] += i;
}

qsort(result, matSize, sizeof(result[0]), cmp);

for(int i = 0; i < k; i++){
res[i] = result[i] % matSize;
}

return res;
}

运行效率如下所示:

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


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

试题要求如下:

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

解答思路:

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

回答(C语言):

bool checkIfExist(int* arr, int arrSize){
int temp;

for(int i = 0;i<arrSize;i++){
if(arr[i]%2 == 0){
temp = arr[i]/2;

for(int j=0;j<arrSize;j++){
if(temp == arr[j] && i!=j)
return true;
}
}
}

return false;
}

运行效率如下所示:

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


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

试题要求如下:

力扣(LeetCode)刷题,简单题(第25期)_提升编程能力_15

解答思路:

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

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

回答(C语言):

#define MAXSIZE 100

int IntergerSum(int n) {
int res = 0;

while (n) {
res += n % 10;
n = n / 10;
}

return res;
}

int countLargestGroup(int n){
int arr[MAXSIZE] = {0};
int cnt, val;

for (int i = 1; i <= n; i++) {
arr[IntergerSum(i)]++;
}

val = arr[1];
cnt = 1;

for (int i = 2; i < MAXSIZE; i++) {
if (arr[i] == val) {
cnt++;
} else if (arr[i] > val) {
val = arr[i];
cnt = 1;
}
}

return cnt;
}

运行效率如下所示:

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


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

试题要求如下:

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

回答(C语言):

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

return false;
}

运行效率如下所示:

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


第10题:​​替换所有的问号​​

试题要求如下:

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

解答思路:

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

回答(C语言):

char * modifyString( char * s ){
for( int i = 0 ; s[i] != '\0' ; i++ ) {
if( s[i] == '?' ) {
char ch = 'a';

while(( i > 0 && ch == s[ i - 1 ]) || (s[ i +1 ] != '\0' && ch == s[ i + 1 ])) {
ch++;
}

s[i] = ch;
}
}
return s;
}

运行效率如下所示:

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