LeetCode刷题总结之二

新的一篇刷题博客,现在hexo博客点击目录跳转的问题还没解决,一篇博客里面写太多,不太合适。

405. 数字转换为十六进制-简单

  • 题目描述

给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

注意:

  1. 十六进制中所有字母(a-f)都必须是小写。
  2. 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
  3. 给定的数确保在32位有符号整数范围内。
  4. 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

事例:

输入:
26

输出:
“1a”

  • 解题思路

考察的基础知识:

  1. 这一题考察的是基础知识,在这里学到了很多。首先是原码,补码,补码的区别,然后是编译器对C++语言里面的具体类型的大小的决定作用。在这篇博客《【C++】unsigned int和补码》里面,把这些知识讲的很清楚,甚至还把具体的文献都贴出来了。还有这篇博客《一道C++面试题和补码、无符号数减法运算》讲的也不错,可以参考一下。
  2. 第二个考察的是如何将十进制转成十六进制,首先需要考虑两个问题,一个是负数的问题(这个通过1. 已经解决了,通过将有符号数转成无符号数,得到解决(unsigned int)),第二个是转换的问题:转换时:先求余,判断是否大于9,然后再将商,重复进行上面的操作。
  3. 第三个学到的就是string 类型可以用insert函数,进行插入,其中两个参数一个是插入的位置,一个是插入的字符(注意是字符)
  • 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>class Solution{
> public:
> string toHex(int num){
> if(num==0)
> return "0";
> string ans;
> unsigned in input_data = (unsigned in)num;
> while(input_data){
> int a = input_data%16;
> string c;
> input_data /=16;
> if(a>9)
> c = 'a' + a-10;
> else
> c = '0' + a;
> ans.insert(0,c);
> }
> return ans;
> }
>};
>
>
>

563. 二叉树的坡度-简单

  • 题目描述

给定一个二叉树,计算整个树的坡度。

一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。

整个树的坡度就是其所有节点的坡度之和。

  • 解题思路

这一题就是用的递归的方法,但是递归稍有不慎就容易出错,在逻辑上一定要准确,计算的步骤是:先算出左子树和右子树的值,然后将头结点的左节点的值和右节点的值的和算到头结点上,最后返回总的值

  • 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>class Solution{
> int findTilt(TreeNode* root){
> if(root == nullptr)
> return 0;
> int sum_left = findTilt(root->left);
> int sum_right = findTilt(root->right);
> //前面这两句必须放在前面 不能直接放在 最后的return 里面 因为 这个对左右子树的计算包含着头结点值的叠加,这个非常重要。
> int val_left = root->left?root->left->val:0;
> int val_right = root->right?root->right->val:0;
> root->val += val_left + val_right;
> return sum_left + sum_right + abs(val_left - val_right);
> }
>};
>