二刷LeetCode--108. 将有序数组转换为二叉搜索树、125. 验证回文串、136. 只出现一次的数字(C++版本)

文章介绍了如何将有序数组转换为二叉搜索树,采用递归方法,以数组中间元素为根节点。同时,文章涵盖了验证字符串是否为回文的方法,通过忽略非字母数字字符并转为小写比较。此外,文章还讨论了在整数数组中找到只出现一次的数字的策略,利用异或操作找出唯一值。
摘要由CSDN通过智能技术生成

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;
    }
}; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值