力扣(LeetCode)定期刷题,每期 10 道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。
第 1 题:将整数转换为两个无零整数的和
试题要求如下:
解答思路:
一对一对筛选,若一组数值某个数存在含 0 组成,则跳过该组。
回答(C 语言):
/** * Note: The returned array must be malloced, assume caller calls free(). */int* getNoZeroIntegers(int n, int* returnSize){ int i = 1,j = n-1; int temp = 0; int* data_buf = (int*)malloc((2)*sizeof(int)); while(i<j){ temp = i; while(temp % 10 != 0){ temp /= 10; } if(temp != 0){ i++; j--; continue; } temp = j; while(temp % 10 != 0){ temp /= 10; } if(temp != 0){ i++; j--; continue; } break; } data_buf[0] = i; data_buf[1] = j; *returnSize = 2; return data_buf;}
复制代码
运行效率如下所示:
第 2 题:一周中的第几天
试题要求如下:
解答思路:
1、明确起点 1971.1.1 - "Friday", 用最小值避免符号运算;
2、计算从 1971.1.1 到(day, month, year)的天数, 需要注意中间年份会有闰年, 另外当前年份需要单独运算;
3、根据天数差值, 对 7(一周 7 天)进行求余, 并且需要考虑起点是"Friday"(周五)的偏移。
回答(C 语言):
char * dayOfTheWeek(int day, int month, int year){ const char *s[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; if(year < 1971 || year > 2100) return NULL; int daysOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int sum = 0; for(int i = 1971; i < year; i ++) { if(0 == i % 400 || (0 != i % 100 && 0 == i % 4)) { sum += 366; } else { sum += 365; } } if(0 == year % 400 || (0 != year % 100 && 0 == year % 4)) { daysOfMonth[1] = 29; } for(int i = 0; i < month - 1; i ++) { sum += daysOfMonth[i]; } sum += day - 1; return s[(sum + 5) % 7];}
复制代码
运行效率如下所示:
第 3 题:把二叉搜索树转换为累加树
试题要求如下:
解答思路:
在递归方法中,我们维护一些递归调用过程中可以访问和修改的全局变量。首先我们判断当前访问的节点是否存在,如果存在就递归右子树,递归回来的时候更新总和和当前点的值,然后递归左子树。如果我们分别正确地递归 root.right 和 root.left ,那么我们就能正确地用大于某个节点的值去更新此节点,然后才遍历比它小的值。
回答(C 语言):
/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */static void dfs(struct TreeNode* psRoot, int* pSum){ if (NULL == psRoot) { return; } dfs(psRoot->right, pSum); *pSum += psRoot->val; psRoot->val = *pSum; dfs(psRoot->left, pSum);} struct TreeNode* convertBST(struct TreeNode* root){ int sum = 0; dfs(root, &sum); return root;}
复制代码
运行效率如下所示:
第 4 题:连续字符
试题要求如下:
回答(C 语言):
int maxPower(char * s){ int i,cou = 1,num = 0,len = strlen(s)-1; char temp = s[0]; for(i = 1;i <= len;i++){ if(temp == s[i]){ cou++; if(cou > num){ num = cou; } } else{ cou = 1; } temp = s[i]; } if(num == 0){ num = 1; } return num;}
复制代码
运行效率如下所示:
第 5 题:拿硬币
试题要求如下:
回答(C 语言):
int minCount(int* coins, int coinsSize){ int cou = 0; int temp = 0; for(int i = 0;i < coinsSize;i++) { temp = coins[i]; while(temp > 0){ cou++; temp -= 2; } } return cou;}
复制代码
运行效率如下所示:
第 6 题:删除中间节点
试题要求如下:
解答思路:
将 node->next 指向的地址传给 node,然后释放掉多余节点。
注意给出的形参不是头节点。
回答(C 语言):
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */void deleteNode(struct ListNode* node) { struct ListNode *t=node->next; *node=*t; free(t);}
复制代码
运行效率如下所示:
第 7 题:猜数字
试题要求如下:
解答思路:
第一次在力扣做这么简单的题,判断每一位元素是否相等。
回答(C 语言):
int game(int* guess, int guessSize, int* answer, int answerSize){ int cou = 0; for(int i = 0;i < guessSize;i++){ if(guess[i] == answer[i]){ cou++; } } return cou;}
复制代码
运行效率如下所示:
第 8 题:整数的各位积和之差
试题要求如下:
回答(C 语言):
int subtractProductAndSum(int n){ int product = 1,sum = 0; for(int i = 0,num = n;num > 0;i++){ product *= num%10; sum += num%10; num /= 10; } return product-sum;}
复制代码
运行效率如下所示:
第 9 题:一维数组的动态和
试题要求如下:
解答思路:
求取前缀和,直接对原数组求取,不用额外分配存储空间。
回答(C 语言):
/** * Note: The returned array must be malloced, assume caller calls free(). */int *runningSum(int *nums, int numsSize, int *returnSize){ for(int i = 1;i < numsSize;i++){ nums[i] = nums[i] + nums[i-1]; } *returnSize = numsSize; return nums;}
复制代码
运行效率如下所示:
第 10 题:统计位数为偶数的数字
试题要求如下:
回答(C 语言):
int findNumbers(int* nums, int numsSize){ int temp = 0,cou = 0,data = 0; for(int i = 0;i < numsSize;i++){ temp = nums[i]; while(temp > 0) { cou++; temp /= 10; } if(cou%2 == 0){ data++; } cou = 0; } return data;}
复制代码
运行效率如下所示
评论