22.日常算法

1. 按奇偶排序数组

题目来源
给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。
返回满足此条件的 任一数组 作为答案。

示例 1:
输入:nums = [3,1,2,4]
输出:[2,4,3,1]
解释:[4,2,3,1]、[2,4,1,3] 和 [4,2,1,3] 也会被视作正确答案。

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        while (left != right){
            while (left < right && nums[left] % 2 == 0) left++;
            while (left < right && nums[right] % 2 != 0) right--;
            swap(nums[left], nums[right]);
        }
        return nums;
    }
};

2. 找到字符串中所有字母异位词

题目来源
给定两个字符串 s 和 p,找到 s 中所有 p 的 变位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
变位词 指字母相同,但排列不同的字符串。

示例 1:
输入: s = “cbaebabacd”, p = “abc”
输出: [0,6]
解释:
起始索引等于 0 的子串是 “cba”, 它是 “abc” 的变位词。
起始索引等于 6 的子串是 “bac”, 它是 “abc” 的变位词。

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ret;
        if (p.size() > s.size()) return ret;
        unordered_map<char, int> hash;
        for (auto & x : p) hash[x]++;
        int left = 0, right = 0, count = 0;
        while (right < s.size()){
            hash[s[right]]--;
            count++;
            while (hash[s[right]] < 0){
                hash[s[left++]]++;
                --count;
            }
            if (count == p.size()) ret.push_back(left);
            ++right;
        }
        return ret;
    }
};

你可能感兴趣的:(#,每日算法题,算法,数据结构)