905.按奇偶排序数组 & 884.两句话中的不常见单词

95 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

905.按奇偶排序数组

题目大意

给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。

返回满足此条件的 任一数组 作为答案。

样例

示例 1:

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

示例 2:

输入:nums = [0]
输出:[0]

数据规模

提示:

  • 1 <= nums.length <= 5000
  • 0 <= nums[i] <= 5000

思路

用最简单的方法即可。

遍历nums两次:

  • 第一次将所有的偶数存储到ans中;
  • 第二次将所有的奇数存储到ans中。

最后返回ans

// short int long float double bool char string void
// array vector stack queue auto const operator
// class public private static friend extern 
// sizeof new delete return cout cin memset malloc
// relloc size length memset malloc relloc size length
// for while if else switch case continue break system
// endl reverse sort swap substr begin end iterator
// namespace include define NULL nullptr exit equals 
// index col row arr err left right ans res vec que sta
// state flag ch str max min default charray std
// maxn minn INT_MAX INT_MIN push_back insert
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int>PII;
typedef pair<int, string>PIS;
const int maxn=1e6+50;//注意修改大小
long long read(){long long x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;}
ll qpow(ll x,ll q,ll Mod){ll ans=1;while(q){if(q&1)ans=ans*x%Mod;q>>=1;x=(x*x)%Mod;}return ans%Mod;}

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {
        vector<int>ans;
        for(auto it:nums){
            if(it%2==0){
                ans.emplace_back(it);
            }
        }
        for(auto it:nums){
            if(it%2){
                ans.emplace_back(it);
            }
        }
        return ans;
    }
};

题目

884.两句话中的不常见单词

题目大意

句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。

如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的

给你两个 句子 s1s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。

样例

image-20220130133856649

数据规模

image-20220130133919002

思路1

考虑将s1,s2s1,s2中的所有字符串统计一遍,只有数量为11的加入vector<string>中。 考虑如何分解s1,s2s1,s2中的字符串?可以使用stringstream进行分解。定义一个stringstream ss1,然后将s1s1导入到ss1ss1,即ss1<<s1,然后每次将字符串存储到aa中,即ss1>>a,然后可以选择情况ss1ss1,即ss1.clear(),或者重新定义一个 ss2ss2。然后顺序遍历unordered_map<string,int>mp中的所有元素即可。

代码1

class Solution {
public:
    vector<string> uncommonFromSentences(string s1, string s2) {
        unordered_map<string,int>mp;
        stringstream ss1,ss2;
        ss1<<s1;
        string a;
        while(ss1>>a){
            mp[a]++;
        }
        ss2<<s2;
        while(ss2>>a){
            mp[a]++;
        }
        vector<string>ans;
        for(auto it:mp){
            if(it.second==1){
                ans.push_back(it.first);
            }
        }
        return ans;
    }
};

思路2

使用python语言可以更方便的读入。

然后将list alist \ a转换为CounterCounter,这样就可以知道每个字符串的数量。

代码2

class Solution:
    def uncommonFromSentences(self, s1: str, s2: str) -> List[str]:
        a=s1.split(" ")
        a+=s2.split(" ")
        a=Counter(a)
        ans=[]
        for it,num in a.items():
            if num==1:
                ans.append(it)
        return ans