初识Leetcode----学习(十五)【验证回文串、只出现一次的数字】

验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

输入: "race a car"
输出: false

1.对给定的字符串,根据题目要求从两边同时遍历,并进行比较(运用cctype头文件中的函数):

class Solution {
public:
    bool isPalindrome(string s) {
        int left = 0, right = s.size() - 1;
        while (left < right)
        {
            if (!isalnum(s[left]))   //判断如果不是字母、数字则左边递增
                ++left;
            else if(!isalnum(s[right])) //判断如果不是字母、数字则右边递增
                --right;
            else if(tolower(s[left]) != tolower(s[right])) //将字母都化为小写并进行比较
                return false;
            else 
            {
                ++left;
                --right;
            }
        }
        return true;
    }
};

只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

1.考虑先将数组排序,然后遍历数组,如果当前元素跟下一元素相等,则递增i到下一个判断元素,否则返回该元素,则得到出现一次的元素:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
       sort(nums.begin(), nums.end());    //按大小将数组排序
       for (int i = 0; i < nums.size(); ++i)  //遍历数组
       {
           if (nums[i] != nums[i+1])   //如果当前元素不等于下一元素,则此元素为出现一次的元素
               return nums[i];
           else       //否则递增到下一判断的元素
               ++i;
       }
    }
};

2.利用异或的性质,当当前元素遇到相同的元素时,此时异或返回的是0,如果未出现相同元素,则异或得到的就是那个只出现一次的元素(异或的性质):

class Solution {
public:
    int singleNumber(vector<int>& nums) {
       int n = nums.size(), result = 0;
       for (int i = 0; i < n; ++i)
       {
           result ^= nums[i];   //异或判断是否相同的元素
       }
       return result;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_38790716/article/details/83246342