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

举报
不脱发的程序猿 发表于 2020/12/28 00:52:00 2020/12/28
【摘要】 目录 第1题:将整数转换为两个无零整数的和 第2题:一周中的第几天 第3题:把二叉搜索树转换为累加树 第4题:连续字符 第5题:拿硬币 第6题:删除中间节点 第7题:猜数字 第8题:整数的各位积和之差 第9题:一维数组的动态和 第10题:统计位数为偶数的数字 力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效...

目录

第1题:将整数转换为两个无零整数的和

第2题:一周中的第几天

第3题:把二叉搜索树转换为累加树

第4题:连续字符

第5题:拿硬币

第6题:删除中间节点

第7题:猜数字

第8题:整数的各位积和之差

第9题:一维数组的动态和

第10题:统计位数为偶数的数字


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

第1题:将整数转换为两个无零整数的和

试题要求如下:

解答思路:

一对一对筛选,若一组数值某个数存在含0组成,则跳过该组。

回答(C语言):


  
  1. /**
  2. * Note: The returned array must be malloced, assume caller calls free().
  3. */
  4. int* getNoZeroIntegers(int n, int* returnSize){
  5. int i = 1,j = n-1;
  6. int temp = 0;
  7. int* data_buf = (int*)malloc((2)*sizeof(int));
  8. while(i<j){
  9. temp = i;
  10. while(temp % 10 != 0){
  11. temp /= 10;
  12. }
  13. if(temp != 0){
  14. i++;
  15. j--;
  16. continue;
  17. }
  18. temp = j;
  19. while(temp % 10 != 0){
  20. temp /= 10;
  21. }
  22. if(temp != 0){
  23. i++;
  24. j--;
  25. continue;
  26. }
  27. break;
  28. }
  29. data_buf[0] = i;
  30. data_buf[1] = j;
  31. *returnSize = 2;
  32. return data_buf;
  33. }

运行效率如下所示:


第2题:一周中的第几天

试题要求如下:

解答思路:

1、明确起点1971.1.1 - "Friday", 用最小值避免符号运算;

2、计算从1971.1.1到(day, month, year)的天数, 需要注意中间年份会有闰年, 另外当前年份需要单独运算;

3、根据天数差值, 对7(一周7天)进行求余, 并且需要考虑起点是"Friday"(周五)的偏移。

回答(C语言):


  
  1. char * dayOfTheWeek(int day, int month, int year){
  2. const char *s[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
  3. if(year < 1971 || year > 2100) return NULL;
  4. int daysOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  5. int sum = 0;
  6. for(int i = 1971; i < year; i ++)
  7. {
  8. if(0 == i % 400 || (0 != i % 100 && 0 == i % 4))
  9. {
  10. sum += 366;
  11. }
  12. else
  13. {
  14. sum += 365;
  15. }
  16. }
  17. if(0 == year % 400 || (0 != year % 100 && 0 == year % 4))
  18. {
  19. daysOfMonth[1] = 29;
  20. }
  21. for(int i = 0; i < month - 1; i ++)
  22. {
  23. sum += daysOfMonth[i];
  24. }
  25. sum += day - 1;
  26. return s[(sum + 5) % 7];
  27. }

运行效率如下所示:


第3题:把二叉搜索树转换为累加树

试题要求如下:

解答思路:

在递归方法中,我们维护一些递归调用过程中可以访问和修改的全局变量。首先我们判断当前访问的节点是否存在,如果存在就递归右子树,递归回来的时候更新总和和当前点的值,然后递归左子树。如果我们分别正确地递归 root.right 和 root.left ,那么我们就能正确地用大于某个节点的值去更新此节点,然后才遍历比它小的值。

回答(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. static void dfs(struct TreeNode* psRoot, int* pSum)
  10. {
  11. if (NULL == psRoot)
  12. {
  13. return;
  14. }
  15. dfs(psRoot->right, pSum);
  16. *pSum += psRoot->val;
  17. psRoot->val = *pSum;
  18. dfs(psRoot->left, pSum);
  19. }
  20. struct TreeNode* convertBST(struct TreeNode* root){
  21. int sum = 0;
  22. dfs(root, &sum);
  23. return root;
  24. }

运行效率如下所示:


第4题:连续字符

试题要求如下:

回答(C语言):


  
  1. int maxPower(char * s){
  2. int i,cou = 1,num = 0,len = strlen(s)-1;
  3. char temp = s[0];
  4. for(i = 1;i <= len;i++){
  5. if(temp == s[i]){
  6. cou++;
  7. if(cou > num){
  8. num = cou;
  9. }
  10. }
  11. else{
  12. cou = 1;
  13. }
  14. temp = s[i];
  15. }
  16. if(num == 0){
  17. num = 1;
  18. }
  19. return num;
  20. }

运行效率如下所示:


第5题:拿硬币

试题要求如下:

回答(C语言):


  
  1. int minCount(int* coins, int coinsSize){
  2. int cou = 0;
  3. int temp = 0;
  4. for(int i = 0;i < coinsSize;i++)
  5. {
  6. temp = coins[i];
  7. while(temp > 0){
  8. cou++;
  9. temp -= 2;
  10. }
  11. }
  12. return cou;
  13. }

运行效率如下所示:


第6题:删除中间节点

试题要求如下:

解答思路:

将node->next指向的地址传给node,然后释放掉多余节点。

注意给出的形参不是头节点。

回答(C语言):


  
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. void deleteNode(struct ListNode* node) {
  9. struct ListNode *t=node->next;
  10. *node=*t;
  11. free(t);
  12. }

运行效率如下所示:


第7题:猜数字

试题要求如下:

解答思路:

第一次在力扣做这么简单的题,判断每一位元素是否相等。

回答(C语言):


  
  1. int game(int* guess, int guessSize, int* answer, int answerSize){
  2. int cou = 0;
  3. for(int i = 0;i < guessSize;i++){
  4. if(guess[i] == answer[i]){
  5. cou++;
  6. }
  7. }
  8. return cou;
  9. }

运行效率如下所示:


第8题:整数的各位积和之差

试题要求如下:

回答(C语言):


  
  1. int subtractProductAndSum(int n){
  2. int product = 1,sum = 0;
  3. for(int i = 0,num = n;num > 0;i++){
  4. product *= num%10;
  5. sum += num%10;
  6. num /= 10;
  7. }
  8. return product-sum;
  9. }

运行效率如下所示:


第9题:一维数组的动态和

试题要求如下:

解答思路:

求取前缀和,直接对原数组求取,不用额外分配存储空间。

回答(C语言):


  
  1. /**
  2. * Note: The returned array must be malloced, assume caller calls free().
  3. */
  4. int *runningSum(int *nums, int numsSize, int *returnSize)
  5. {
  6. for(int i = 1;i < numsSize;i++){
  7. nums[i] = nums[i] + nums[i-1];
  8. }
  9. *returnSize = numsSize;
  10. return nums;
  11. }

运行效率如下所示:


第10题:统计位数为偶数的数字

试题要求如下:

回答(C语言):


  
  1. int findNumbers(int* nums, int numsSize){
  2. int temp = 0,cou = 0,data = 0;
  3. for(int i = 0;i < numsSize;i++){
  4. temp = nums[i];
  5. while(temp > 0)
  6. {
  7. cou++;
  8. temp /= 10;
  9. }
  10. if(cou%2 == 0){
  11. data++;
  12. }
  13. cou = 0;
  14. }
  15. return data;
  16. }

运行效率如下所示:

文章来源: blog.csdn.net,作者:不脱发的程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/m0_38106923/article/details/106658225

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。