アルゴリズム20日
6日目
1 回だけ出現する文字すべての文字が小文字で、1 つの文字を除くすべての文字が2 回出現し、1 つのみが 1 回出現するという
文字セットがある場合、その文字を見つけます。
入力: [a,a,c,c,d,d,e]
出力: [e]
一度だけ現れる文字出力をトラバースするために固定配列を定義することを考えるのは自然なことです
**方法 1: **マップを定義する
char f(vector<char> &temp)
{
int map[26]={
0};
for(int i=0;i<temp.size();i++)
map[temp[i]-'a']++;
for(int i=0;i<26;i++)
if(map[i]==1)
return i+'a';
}
時間計算量は O(n) で、空間計算量は O(n) です。 leetcode でビット操作を使用する方法も見ました。多くの int 型が 32 ビットを占有し、ビット操作が実行されることは誰もが知っています。数値の各ビットの演算、ビット演算は6種類あります
~ 否定
^ XOR
| Or
& および
<< 左シフト
>> 右シフト
方法 2: ビット演算
XOR 演算の真理値表は次のとおりです。
0,0 | 0 |
---|---|
0,1 | 1 |
1,0 | 1 |
1,1 | 0 |
したがって、2 つの同一の値を XOR 演算すると、結果は 0 となり、この数値に応じて 0 と任意の数値の XOR 演算が行われます。 =e ;
したがって、時間計算量 O(n) と空間計算量 O(1) のアルゴリズムが存在する可能性があります。
char m(vector<char> temp)
{
char a=temp[0]^0;
for(int i=1;i<temp.size();i++)
a^=temp[i];
return a;
}
ビット演算には素晴らしい応用例がたくさんあります。