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>中。(宏定义,并非真正函数)
- 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博客) - isalpha() 用来判断一个字符是否为字母,如果是字符则返回非0,否则返回0
- isdigit() 判断一个字符是否是十进制数字 0123456789
- islower) 判断一个字符是否为小写字母 a-z
- isupper() 判断一个字符是否为大写字母 A-Z
- isblank() 判断一个字符是否为空格,空格字符的ASCII值是32 正则表达式为\s
- tolower() 将大写字母转换为小写字母 转换成功返回与c对应的小写字母,转换失败返回c
- 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;
}
};