41.哀家要长脑子了!

1.168. Excel表列名称 - 力扣(LeetCode)

这个题目可以看成是一个进制问题,26进制。

但是本题不一样的是 任何 x%26∈[0, 25],但是我们要的是[1,26] 与 [A, Z] 一一对应。

26%26=0 不在范围内, 没有表示0的符号,所以我们需要将输入的数减1,以便将0-25映射到A-Z

class Solution {
public:
    string convertToTitle(int columnNumber) {
        string res;
        while(columnNumber--)
        {
            int tmp = columnNumber % 26;
            res += (char)(tmp + 'A');
            columnNumber /= 26;
        }
        reverse(res.begin(), res.end());
        return res;
    }
};
2.171. Excel 表列序号 - 力扣(LeetCode)

 从低位开始转换,转换成的数字是字符串每个位置上的数字乘以相应位权的总和。

 

class Solution {
public:
    int titleToNumber(string columnTitle) {
        int res = 0;
        long pos = 1;
        for(int i = columnTitle.size() - 1; i >= 0; i--)
        {
            int tmp = (columnTitle[i] + 1) % 65;
            res += tmp * pos;
            // 位权改变
            pos *= 26;
        }
        return  res;
    }
};
3. 136. 只出现一次的数字 - 力扣(LeetCode)

 妈呀,太奇妙了,如果没有题目的要求应该有很多方法。哈希表,桶排序...

这里用的是异或运算:(异1)

        ① 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。
        ② 任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
        ③ 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

题目中有限制:数组中的元素只会出现一次或者两次,那么依次与0进行异或,出现一次的会把0异或成本身,出现两次的会把0异或成0,让它可以接着跟其他元素异或。(异或是二进制位运算)

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int res = 0;
        for(int num : nums)
        {
            res ^= num;
        }
        return res;
    }
};
3.125. 验证回文串 - 力扣(LeetCode)

]

 判断输入串中的现在遍历到的字符是不是字母,是的话就把它转换为小写字母,然后放到一个字符串中,整个输入串遍历完毕后,再新生成一个字符串是刚刚生成字符串的逆序 判断两个是否相等就好。

class Solution {
public:
    bool isPalindrome(string s) {
        string t;
        for(char ch : s)
        {
            if(isalpha(ch))
                t += tolower(ch);
        }
        string s1(t.rbegin(), t.rend());
        return s1 == t;
    }
};
一些函数

位于头文件#include<ctype.h>中。(宏定义,并非真正函数)

  1. isalnum()
    判断一个字符是否是字母或者数字 0-9 || a-z || A-Z
    注意:向函数传入int等数值类型时,应当成对应ASCII字符对待。例如isalnum(0)返回false,而isalnum('0)才是返回true。因为ASCII值0代表着ASCII表的控制字符:NULL,而字符'0'的ASCII值是48。参数是int型,不要传入指针类型 (来源:宇智波鼬D-CSDN博客
  2. isalpha() 用来判断一个字符是否为字母,如果是字符则返回非0,否则返回0
  3. isdigit() 判断一个字符是否是十进制数字 0123456789
  4. islower) 判断一个字符是否为小写字母 a-z
  5. isupper() 判断一个字符是否为大写字母 A-Z
  6. isblank() 判断一个字符是否为空格,空格字符的ASCII值是32 正则表达式为\s
  7. tolower() 将大写字母转换为小写字母 转换成功返回与c对应的小写字母,转换失败返回c
  8. toupper() 将小写字母转换为大写字母

     9. c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素

    10. c.rend() 返回一个逆序迭代器,指向容器c的第一个元素前面的位置

4.98. 验证二叉搜索树 - 力扣(LeetCode)

 二叉搜索树:

        ① 左子树是二叉搜索树,右子树也是二叉搜索树

        ② 中序遍历出来的数组是一个有序递增的数组

class Solution {
public:
    TreeNode *pre = NULL;    
    bool isValidBST(TreeNode* root) {
        if(root == NULL) return true;
        bool l = isValidBST(root->left);
        
        if(pre != NULL && root->val <= pre->val) return false;
        pre = root;

        bool r = isValidBST(root->right);
        
        return l && r;
    } 
};

mad,递归真的神奇,

根据二叉搜索树的性质,进行中序遍历,经过bool l = isValidBST(root->left);后,pre指向的就是root左子树的根节点,即root的左孩子,在二叉搜索树中,左孩子要小于根结点,凡是不满足这条的就不是二叉搜索树。同理递归对待root的右子树

5.100. 相同的树 - 力扣(LeetCode)

 

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        // 同时到达叶子结点 并且都为空(顺便判断了值) 
        if(!p && !q) return true;

        // 一棵树到达叶子结点 另一颗棵树没有 结构不同 
        if(!p || !q) return false;

        // 到达这一步了 说明这两个结点既不是叶子结点又都存在 就需要判断两个结点的值是否相同了
        // 如果值不相同那也是不行的 不能用==直接返回true 因为那样没有判断子树的情况就直接返回了
        if(p->val != q->val) return false;

        // 递归处理两棵树的左子树、右子树
        bool left = isSameTree(p->left, q->left);
        bool right = isSameTree(p->right, q->right);
        
        return left && right;
    }
};

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值