108. 将有序数组转换为二叉搜索树
复习知识点:题目给出有序数组,因此可以通过递归,每次选取中间位置得元素作为树根,然后不断得分割目前序列,直到递归终止。
// /**
// * Definition for a binary tree node.
// * struct TreeNode {
// * int val;
// * TreeNode *left;
// * TreeNode *right;
// * TreeNode() : val(0), left(nullptr), right(nullptr) {}
// * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
// * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
// * };
// */
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return my_tree(nums, 0, nums.size() - 1);
}
TreeNode* my_tree(vector<int>& nums, int left, int right)
{
if(left > right)
return nullptr;
// 中间位置元素当树根,然后每次分割剩余的元素集合
int mid = (left + right) / 2;
TreeNode* root =new TreeNode(nums[mid]);
root -> left = my_tree(nums, left, mid - 1);
root -> right = my_tree(nums, mid + 1, right);
return root;
}
};
125. 验证回文串
复习知识点:回文串较为简单,从左右两侧开始向中间滑动即可,需要注意的是按照题目要求将字符转化为小写然后取消空格和其他的干扰。
class Solution {
public:
bool isPalindrome(string s) {
string res;
// 左右双指针向中间遍历即可
for(char a : s)
{
// 首先处理非字母数字字符,大写转小写
if(isalnum(a))
{
res += tolower(a);
}
}
int left = 0, right = res.size() - 1;
while(left < right)
{
if(res[left] != res[right])
return false;
++left;
--right;
}
return true;
}
};
136. 只出现一次的数字
复习知识点:本题可以使用哈希表进行,最后将second为1的元素取出,但是不满足题意,空间复杂度会高,因此使用较为巧妙的办法,利用逻辑运算异或的特性将全部的字符异或即可得到结果。
class Solution {
public:
int singleNumber(vector<int>& nums) {
// 本题使用哈希表会出现不满足题意得情况,因此需要使用异或这种特殊办法去进行计算
// 相异为真相同为假
int res = 0;
for(int num : nums)
res ^= num;
return res;
}
};