目录
力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。
第1题:二叉搜索树的范围和
试题要求如下:
回答(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;
-
}
运行效率如下所示:
第2题:缀点成线
试题要求如下:
解答思路:
直线的两点式方程(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;
-
}
运行效率如下所示:
第3题:删除回文子序列
试题要求如下:
解答思路:
因为是删除回文子序列(就是顺序不变的情况下,可以算隔开的字符),所以只有三种情况。
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;
-
}
运行效率如下所示:
第4题:奇数值单元格的数目
试题要求如下:
回答(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;
-
}
运行效率如下所示:
第5题:重新排列字符串
试题要求如下:
回答(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;
-
}
运行效率如下所示:
第6题:方阵中战斗力最弱的 K 行
试题要求如下:
回答(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;
-
}
运行效率如下所示:
第7题:检查整数及其两倍数是否存在
试题要求如下:
解答思路:
暴力破解。遍历数组,找出数组中的偶数,只有偶数才能是其它数的两倍,然后在这个条件下,给这个偶数除以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;
-
}
运行效率如下所示:
第8题:统计最大组的数目
试题要求如下:
解答思路:
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;
-
}
运行效率如下所示:
第9题:存在连续三个奇数的数组
试题要求如下:
回答(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;
-
}
运行效率如下所示:
第10题:替换所有的问号
试题要求如下:
解答思路:
遍历字符串,如果当前字符为'?',用'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;
-
}
运行效率如下所示:
转载:https://blog.csdn.net/m0_38106923/article/details/108635316