力扣(LeetCode)刷题,简单+中等题(第35期)

举报
不脱发的程序猿 发表于 2021/05/17 01:57:54 2021/05/17
【摘要】 力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。 第1题:解码异或后的排列 试题要求如下: 回答(C语言): /** * Note: The returned array must be malloced, assume caller calls free(). */int* decode(in...

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

第1题:解码异或后的排列

试题要求如下:

回答(C语言):


  
  1. /**
  2. * Note: The returned array must be malloced, assume caller calls free().
  3. */
  4. int* decode(int* encoded, int encodedSize, int* returnSize) {
  5. int n = encodedSize + 1;
  6. int total = 0;
  7. for (int i = 1; i <= n; i++) {
  8. total ^= i;
  9. }
  10. int odd = 0;
  11. for (int i = 1; i < n - 1; i += 2) {
  12. odd ^= encoded[i];
  13. }
  14. int* perm = malloc(sizeof(int) * n);
  15. *returnSize = n;
  16. perm[0] = total ^ odd;
  17. for (int i = 0; i < n - 1; i++) {
  18. perm[i + 1] = perm[i] ^ encoded[i];
  19. }
  20. return perm;
  21. }

运行效率如下所示:


第2题:不同的二叉搜索树

试题要求如下:

解题思路:


  
  1. int numTrees(int n) {
  2. int G[n + 1];
  3. memset(G, 0, sizeof(G));
  4. G[0] = G[1] = 1;
  5. for (int i = 2; i <= n; ++i) {
  6. for (int j = 1; j <= i; ++j) {
  7. G[i] += G[j - 1] * G[i - j];
  8. }
  9. }
  10. return G[n];
  11. }

运行效率如下所示:


第3题:完美数

试题要求如下:

解题思路:

本题思路就是简单的将因子相加,但是注意循环变量i不能到num,所以用i*i<=num缩小范围。

回答(C语言):


  
  1. bool checkPerfectNumber(int num){
  2. int count=0;
  3. if(num==1)return false;
  4. for(int i=2;i*i<=num;i++){
  5. if(num%i==0)
  6. count+=i+num/i;
  7. }
  8. return count+1==num?true:false;
  9. }

运行效率如下所示:


第4题:数组中两个数的最大异或值

试题要求如下:

解题思路:

回答(C语言):


  
  1. const int HIGH_BIT = 30;
  2. struct HashTable {
  3. int key;
  4. UT_hash_handle hh;
  5. };
  6. int findMaximumXOR(int* nums, int numsSize) {
  7. int x = 0;
  8. for (int k = HIGH_BIT; k >= 0; --k) {
  9. struct HashTable* hashTable = NULL;
  10. // 将所有的 pre^k(a_j) 放入哈希表中
  11. for (int i = 0; i < numsSize; i++) {
  12. // 如果只想保留从最高位开始到第 k 个二进制位为止的部分
  13. // 只需将其右移 k 位
  14. int x = nums[i] >> k;
  15. struct HashTable* tmp;
  16. HASH_FIND_INT(hashTable, &x, tmp);
  17. if (tmp == NULL) {
  18. tmp = malloc(sizeof(struct HashTable));
  19. tmp->key = x;
  20. HASH_ADD_INT(hashTable, key, tmp);
  21. }
  22. }
  23. // 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分
  24. // 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1
  25. int x_next = x * 2 + 1;
  26. bool found = false;
  27. // 枚举 i
  28. for (int i = 0; i < numsSize; i++) {
  29. int x = x_next ^ (nums[i] >> k);
  30. struct HashTable* tmp;
  31. HASH_FIND_INT(hashTable, &x, tmp);
  32. if (tmp != NULL) {
  33. found = true;
  34. break;
  35. }
  36. }
  37. if (found) {
  38. x = x_next;
  39. } else {
  40. // 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0
  41. // 即为 x = x*2
  42. x = x_next - 1;
  43. }
  44. }
  45. return x;
  46. }

运行效率如下所示:


第5题:二叉树的中序遍历

试题要求如下:

解题思路:

二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

回答(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. /**
  10. * Note: The returned array must be malloced, assume caller calls free().
  11. */
  12. void inorder(struct TreeNode* root, int* res, int* resSize) {
  13. if (!root) {
  14. return;
  15. }
  16. inorder(root->left, res, resSize);
  17. res[(*resSize)++] = root->val;
  18. inorder(root->right, res, resSize);
  19. }
  20. int* inorderTraversal(struct TreeNode* root, int* returnSize) {
  21. int* res = malloc(sizeof(int) * 501);
  22. *returnSize = 0;
  23. inorder(root, res, returnSize);
  24. return res;
  25. }

运行效率如下所示:


第6题:猜数字大小

试题要求如下:

解题思路:

此题使用二分查找,将mid输入guess函数,根据返回值调整查找边界,我这里用的是【left,mid】和【mid+1,right】,命中时将mid返回即可。

回答(C语言):


  
  1. /**
  2. * Forward declaration of guess API.
  3. * @param num your guess
  4. * @return -1 if num is lower than the guess number
  5. * 1 if num is higher than the guess number
  6. * otherwise return 0
  7. * int guess(int num);
  8. */
  9. int guessNumber(int n){
  10. int left=1;
  11. int right=n;
  12. while(left<right){
  13. int mid= left+(right-left)/2;
  14. if(guess(mid)<0)right=mid;
  15. else if(guess(mid)>0) left=mid+1;
  16. else return mid;
  17. }return left;
  18. }

运行效率如下所示:


第7题:第三大的数

试题要求如下:

回答(C语言):


  
  1. int thirdMax(int* nums, int numsSize){
  2. int i;
  3. int first = INT_MIN, second = INT_MIN, third = INT_MIN;
  4. int tmp1 = nums[0], tmp2 = nums[0], tmp3 = nums[0];
  5. for(i = 0; i < numsSize; i++) {
  6. /* 先找到第一个与tmp1不同的数,存入tmp2;
  7. * 之后找到与tmp1不同的数,都存入tmp3中;
  8. * 这里必须将tmp1 == tmp2的判断放在第二层,若是放在第一层逻辑出现错误
  9. * if (nums[i] != tmp1 && tmp1 == tmp2) {
  10. tmp2 = nums[i];
  11. } else {
  12. tmp3 = nums[i];
  13. }
  14. * 当nums[i]等于tmp1时,就不需要判断了,
  15. * 但是上面的代码还是会执行tmp3 = nums[i],这就导致错误。
  16. */
  17. if(nums[i] != tmp1) {
  18. if(tmp1 == tmp2) {
  19. tmp2 = nums[i];
  20. } else {
  21. tmp3 = nums[i];
  22. }
  23. }
  24. /* 比较当前的数与first、second、third的大小;
  25. * 当前数 > first时:third变为second、second变为first、first变为当前数;
  26. * first > 当前数 > second时:third变为second、second变为当前数;
  27. * second > 当前数 > third时:third变为当前数;
  28. * 其中当前数 == first、second、third时不需要更新三者的值.
  29. */
  30. if(nums[i] > first) {
  31. third = second;
  32. second = first;
  33. first = nums[i];
  34. } else if(nums[i] < first && nums[i] > second) {
  35. third = second;
  36. second = nums[i];
  37. } else if(nums[i] < second && nums[i] > third) {
  38. third = nums[i];
  39. }
  40. }
  41. /* tmp1和tmp2分别与tmp3的值比较是否相等
  42. * 若有相等的tmp值,表明数组中只有两种新的数,返回first
  43. * 否则返回third
  44. * 这里必须将tmp3与其他两个相比较,因为tmp3是最后改变的,
  45. * 若tmp3也改变了,就说明有三个不同的值。
  46. */
  47. if(tmp1 == tmp3 || tmp2 == tmp3) {
  48. return first;
  49. } else {
  50. return third;
  51. }
  52. }

运行效率如下所示:


第8题:二叉树的后序遍历

试题要求如下:

回答(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. /**
  10. * Note: The returned array must be malloced, assume caller calls free().
  11. */
  12. void postorder(struct TreeNode *root, int *res, int *resSize) {
  13. if (root == NULL) {
  14. return;
  15. }
  16. postorder(root->left, res, resSize);
  17. postorder(root->right, res, resSize);
  18. res[(*resSize)++] = root->val;
  19. }
  20. int *postorderTraversal(struct TreeNode *root, int *returnSize) {
  21. int *res = malloc(sizeof(int) * 2001);
  22. *returnSize = 0;
  23. postorder(root, res, returnSize);
  24. return res;
  25. }

运行效率如下所示:


第9题:N 叉树的最大深度

试题要求如下:

回答(C语言):


  
  1. /**
  2. * Definition for a Node.
  3. * struct Node {
  4. * int val;
  5. * int numChildren;
  6. * struct Node** children;
  7. * };
  8. */
  9. int maxDepth(struct Node* root)
  10. {
  11. if (root == NULL)
  12. {
  13. return 0;
  14. }
  15. else {
  16. int d = 1, m = 0;
  17. for (int i = 0; i < root->numChildren; i++)
  18. {
  19. int c = maxDepth(root->children[i]);
  20. if (m < c) { // 找子树的最大深度
  21. m = c;
  22. }
  23. }
  24. return d + m;
  25. }
  26. }

运行效率如下所示:


第10题:字符串中的单词数

试题要求如下:

解题思路:

判定一个单词结束:当前字符非空格且下一字符为空格或结束符。

回答(C语言):


  
  1. int countSegments(char * s){
  2. int cnt = 0;
  3. while (*s) {
  4. if (*s != ' ' && (*(s + 1) == ' ' || *(s + 1) == '\0'))
  5. cnt++;
  6. s++;
  7. }
  8. return cnt;
  9. }

运行效率如下所示: 

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

原文链接:handsome-man.blog.csdn.net/article/details/116640463

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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