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

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

试题要求如下:

回答(C语言):

/*** Note: The returned array must be malloced, assume caller calls free().*/
int* decode(int* encoded, int encodedSize, int* returnSize) {int n = encodedSize + 1;int total = 0;for (int i = 1; i <= n; i++) {total ^= i;}int odd = 0;for (int i = 1; i < n - 1; i += 2) {odd ^= encoded[i];}int* perm = malloc(sizeof(int) * n);*returnSize = n;perm[0] = total ^ odd;for (int i = 0; i < n - 1; i++) {perm[i + 1] = perm[i] ^ encoded[i];}return perm;
}

运行效率如下所示:


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

试题要求如下:

解题思路:

int numTrees(int n) {int G[n + 1];memset(G, 0, sizeof(G));G[0] = G[1] = 1;for (int i = 2; i <= n; ++i) {for (int j = 1; j <= i; ++j) {G[i] += G[j - 1] * G[i - j];}}return G[n];
}

运行效率如下所示:


第3题:完美数

试题要求如下:

解题思路:

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

回答(C语言):

bool checkPerfectNumber(int num){int count=0;if(num==1)return false;for(int i=2;i*i<=num;i++){if(num%i==0)count+=i+num/i;}return count+1==num?true:false;
}

运行效率如下所示:


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

试题要求如下:

解题思路:

回答(C语言):

const int HIGH_BIT = 30;struct HashTable {int key;UT_hash_handle hh;
};int findMaximumXOR(int* nums, int numsSize) {int x = 0;for (int k = HIGH_BIT; k >= 0; --k) {struct HashTable* hashTable = NULL;// 将所有的 pre^k(a_j) 放入哈希表中for (int i = 0; i < numsSize; i++) {// 如果只想保留从最高位开始到第 k 个二进制位为止的部分// 只需将其右移 k 位int x = nums[i] >> k;struct HashTable* tmp;HASH_FIND_INT(hashTable, &x, tmp);if (tmp == NULL) {tmp = malloc(sizeof(struct HashTable));tmp->key = x;HASH_ADD_INT(hashTable, key, tmp);}}// 目前 x 包含从最高位开始到第 k+1 个二进制位为止的部分// 我们将 x 的第 k 个二进制位置为 1,即为 x = x*2+1int x_next = x * 2 + 1;bool found = false;// 枚举 ifor (int i = 0; i < numsSize; i++) {int x = x_next ^ (nums[i] >> k);struct HashTable* tmp;HASH_FIND_INT(hashTable, &x, tmp);if (tmp != NULL) {found = true;break;}}if (found) {x = x_next;} else {// 如果没有找到满足等式的 a_i 和 a_j,那么 x 的第 k 个二进制位只能为 0// 即为 x = x*2x = x_next - 1;}}return x;
}

运行效率如下所示:


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

试题要求如下:

解题思路:

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

回答(C语言):

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*/
void inorder(struct TreeNode* root, int* res, int* resSize) {if (!root) {return;}inorder(root->left, res, resSize);res[(*resSize)++] = root->val;inorder(root->right, res, resSize);
}int* inorderTraversal(struct TreeNode* root, int* returnSize) {int* res = malloc(sizeof(int) * 501);*returnSize = 0;inorder(root, res, returnSize);return res;
}

运行效率如下所示:


第6题:猜数字大小

试题要求如下:

解题思路:

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

回答(C语言):

/** * Forward declaration of guess API.* @param  num   your guess* @return          -1 if num is lower than the guess number*                1 if num is higher than the guess number*               otherwise return 0* int guess(int num);*/int guessNumber(int n){int left=1;int right=n;while(left<right){int mid= left+(right-left)/2;if(guess(mid)<0)right=mid;else if(guess(mid)>0) left=mid+1;else return mid;}return left;
}

运行效率如下所示:


第7题:第三大的数

试题要求如下:

回答(C语言):

int thirdMax(int* nums, int numsSize){int i;int first = INT_MIN, second = INT_MIN, third = INT_MIN;int tmp1 = nums[0], tmp2 = nums[0], tmp3 = nums[0]; for(i = 0; i < numsSize; i++) {/* 先找到第一个与tmp1不同的数,存入tmp2;* 之后找到与tmp1不同的数,都存入tmp3中;* 这里必须将tmp1 == tmp2的判断放在第二层,若是放在第一层逻辑出现错误* if (nums[i] != tmp1 && tmp1 == tmp2) {tmp2 = nums[i];} else {tmp3 = nums[i];}* 当nums[i]等于tmp1时,就不需要判断了,* 但是上面的代码还是会执行tmp3 = nums[i],这就导致错误。*/if(nums[i] != tmp1) {if(tmp1 == tmp2) {tmp2 = nums[i];} else {tmp3 = nums[i];}}/* 比较当前的数与first、second、third的大小;*          当前数 > first时:third变为second、second变为first、first变为当前数;* first  > 当前数 > second时:third变为second、second变为当前数;* second > 当前数 > third时:third变为当前数;* 其中当前数 == first、second、third时不需要更新三者的值.*/if(nums[i] > first) {third = second;second = first;first = nums[i];} else if(nums[i] < first && nums[i] > second) {third = second;second = nums[i];} else if(nums[i] < second && nums[i] > third) {third = nums[i];}}/* tmp1和tmp2分别与tmp3的值比较是否相等* 若有相等的tmp值,表明数组中只有两种新的数,返回first* 否则返回third* 这里必须将tmp3与其他两个相比较,因为tmp3是最后改变的,* 若tmp3也改变了,就说明有三个不同的值。*/if(tmp1 == tmp3 || tmp2 == tmp3) {return first;} else {return third;}
}

运行效率如下所示:


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

试题要求如下:

回答(C语言):

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*/
void postorder(struct TreeNode *root, int *res, int *resSize) {if (root == NULL) {return;}postorder(root->left, res, resSize);postorder(root->right, res, resSize);res[(*resSize)++] = root->val;
}int *postorderTraversal(struct TreeNode *root, int *returnSize) {int *res = malloc(sizeof(int) * 2001);*returnSize = 0;postorder(root, res, returnSize);return res;
}

运行效率如下所示:


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

试题要求如下:

回答(C语言):

/*** Definition for a Node.* struct Node {*     int val;*     int numChildren;*     struct Node** children;* };*/int maxDepth(struct Node* root)
{if (root == NULL) {return 0; } else {int d = 1, m = 0;for (int i = 0; i < root->numChildren; i++){int c = maxDepth(root->children[i]);if (m < c) { // 找子树的最大深度 m = c;}}return d + m;}
}

运行效率如下所示:


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

试题要求如下:

解题思路:

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

回答(C语言):

int countSegments(char * s){int cnt = 0;while (*s) {if (*s != ' ' && (*(s + 1) == ' ' || *(s + 1) == '\0'))cnt++;s++;}return cnt;
}

运行效率如下所示:

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

  1. Leetcode-How-What 力扣Leetcode刷题指南

    Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...

  2. 力扣(LeetCode)刷题,简单+中等题(第26期)

    目录 第1题:字典序排数 第2题:字符串解码 第3题:查找常用字符 第4题:所有奇数长度子数组的和 第5题:长按键入 第6题:分割字符串的最大得分 第7题:回文链表 第8题:有多少小于当前数字的数字 ...

  3. 力扣(LeetCode)刷题,简单+中等题(第34期)

    目录 第1题:整数转罗马数字 第2题:电话号码的字母组合 第3题:二叉树的所有路径 第4题:砖墙 第5题:下一个排列 第6题:括号生成 第7题:删除并获得点数 第8题:全排列 第9题:颜色分类 第10 ...

  4. 力扣(LeetCode)刷题,简单+中等题(第33期)

    目录 第1题:Z 字形变换 第2题:删除字符串中的所有相邻重复项 第3题:基本计算器 II 第4题:螺旋矩阵 第5题:螺旋矩阵 II 第6题:盛最多水的容器 第7题:删除有序数组中的重复项 II 第8 ...

  5. 力扣(LeetCode)刷题,简单+中等题(第32期)

    目录 第1题:数组的度 第2题:托普利茨矩阵 第3题:爱生气的书店老板 第4题:翻转图像 第5题:有效的数独 第6题:无重复字符的最长子串 第7题:区域和检索 - 数组不可变 第8题:二维区域和检索 ...

  6. 力扣(LeetCode)刷题,简单+中等题(第31期)

    目录 第1题:同构字符串 第2题:最后一块石头的重量 第3题:最小路径和 第4题:键盘行 第5题:存在重复元素 II 第6题:两数相加 第7题:三个数的最大乘积 第8题:等价多米诺骨牌对的数量 第9题 ...

  7. 力扣(LeetCode)刷题,简单+中等题(第30期)

    目录 第1题:单词规律 第2题:找不同 第3题:在排序数组中查找元素的第一个和最后一个位置 第4题:使用最小花费爬楼梯 第5题:寻找峰值 第6题:字符串中的第一个唯一字符 第7题:两个数组的交集 II ...

  8. 力扣(LeetCode)刷题,简单+中等题(第29期)

    目录 第1题:分割数组为连续子序列 第2题:翻转矩阵后的得分 第3题:寻找旋转排序数组中的最小值 第4题:乘积最大子数组 第5题:不同路径 第6题:判断路径是否相交 第7题:摆动序列 第8题:单调递增 ...

  9. 力扣(LeetCode)刷题,简单+中等题(第28期)

    目录 第1题:翻转单词顺序 第2题:顺时针打印矩阵 第3题:总持续时间可被 60 整除的歌曲 第4题:字符串的最大公因子 第5题:上升下降字符串 第6题:将数组分成和相等的三个部分 第7题:可被 5 ...

最新文章

  1. 第十六届全国大学生智能汽车竞赛总决赛 AI视觉组线上赛细则草案 - 初步版本
  2. C#用xpath查找某节点
  3. fill value must be in categories解决一例
  4. 【重大更新】DevExpress v17.2新版亮点—Bootstrap篇(二)
  5. 赋能零售成长型企业营销增长,云徙「数盈·新营销中台」发布
  6. 分享几个接口自动化的实战练手项目
  7. 《构建之法》第4章读后感
  8. linux 修改密码和端口号_WINDOWS/LINUX系统修改管理员密码方法
  9. 怎么用命令开远程主机的telnet服务1
  10. Hvv近期0day总结四
  11. USB 3.0 高清音视频采集芯片——MS2130
  12. 驾照-办理期满换驾驶证
  13. 网站换服务器 备案,网站换服务器备案吗
  14. 服务器硬盘 frn bad,【服务器问题】浪潮inspur服务器个别硬盘亮红灯且发出1长的滴滴声响...
  15. 用python的turtle画圆 转角度前进_使用python实现画出一段给定角度的近似圆弧
  16. 解析:数组名a、数组名取地址a、数组首地址a[0]、数组指针*p
  17. [渝粤教育] 西南交通大学 体育健康课程Ⅰ—太极功夫 参考 资料
  18. 按防电击类型分类的II设备(无保护接地线缆)可免于线对地的浪涌实验
  19. 简单粗暴安卓全屏幕适配
  20. 数通运营商方向常见面试问题(第二部分)

热门文章

  1. Python逻辑运算符 and ,or not 的理解
  2. Android shape 画的圆角带四个黑变 问题
  3. startActivity(xx,xx.class) 传递数据
  4. Android studio 导入jar 文件
  5. spring 基于XML的申明式AspectJ通知的执行顺序
  6. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)
  7. hdu 2156 分数矩阵
  8. 基于 WPF + Modern UI 的 公司OA小助手 开发总结
  9. Notification和KVO有什么不同
  10. datagrid DataFormatString