計蒜客:T1104 找第一個只出現一次的字符

題目描述:

給定一個只包含小寫字母的字符串,請你找到第一個僅出現一次的字符。如果沒有,輸出"no"

輸入格式

一個字符串,長度小於 100000100000。

輸出格式

輸出第一個僅出現一次的字符,若沒有則輸出"no"

解題思路:

有兩種思路,第一種直接使用兩層for循環遍歷字符串,然後輸出第一個只出現一次的字符,然後結束程序,時間複雜度O(n^2)。第二種方法是先循環遍歷一遍字符串,使用一個數組存儲所有字符出現的次數,然後再進行一次循環找到第一個只出現一次的字符,然後輸出並終止程序。時間複雜度O(n)。

方法1:

#include<iostream>
#include<string>
using namespace std;

int main(){
	string s;
	getline(cin,s);
	int n,len = 0;
    len = s.size();
	for(int i=0;i<len;i++){
		for(int j=0;j<len;j++){
			//abcabd 
			if(s[i]==s[j]&&i!=j){
				//cout<<s[i];
				break;				
			}	
			if(j==s.size()-1){
				cout<<s[i];
				return 0;
			}
		}
		
	}
	cout<<"no";
	return 0;
}

方法2:

#include<iostream>
#include<string>
using namespace std;

int main(){
	
	string s;
	int letters[26] = {0};    //使用一個數組來存儲26個字母出現的次數 
	int len = 0;  //存儲s的長度 
	getline(cin, s);
	len = s.length();
	
	//首先循環一次s,統計所有字母出現的次數 
	for(int i=0;i<len;i++){
		letters[s[i]-'a']++; //'a'的ASCII碼爲97 
	}
	//在循環遍歷統計結果,出現第一個出現一次的字符就輸出,並終止
	for(int i=0;i<len;i++){
		if(letters[s[i]-'a']==1){
			cout<<s[i];
			return 0;
		}
	}
	//如果沒有則輸出no
	cout<<"no"; 
	return 0;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章