我在寫這個程式時突然想起一個問題,就是C語言裡給int一維數組初始化賦值的問題,比如我寫:
int index[11]={0}; 那麼此時數組中所有的元素初始化值均為0;但是我寫:
int index[11]={-1};此時我以為所有元素的值均為-1了,其實不是這樣的,當{}中的值的個數小於數組元素個數時,只有數組前面對應的元素被賦值了,而後面多餘的元素被預設初始化為0了,所以這句話執行後,只有index[0]的值為-1,而其餘元素均為0;但是如果我這樣寫:
int index[11]; 那麼你也不要天真地以為所有元素預設值均為0,其實不然,這樣寫的話,所有元素的值均為隨機值。
這就是數組初始化時我們應該注意的地方。好了,下面說說這個演算法:
原始碼如下:
#include <iostream>
using namespace std;
char findIt(const char *str);
int main()
{
char str[]="iamastudenti";
cout << findIt(str) << endl;
return 0;
}
char findIt(const char *str)
{
int count[26]={0};
int index[26]={0}; //注意int數組初始化賦值時,如果寫成={-1}是不能給所有元素初始化為-1的,只有第一個元素是-1,其餘為預設值0
unsigned int i;
int pos;
for(i=0;i<strlen(str);i++)
{
count[str[i]-'a']++; //記錄該字母出現的次數
// cout<<count[str[i]-'a']<<endl;
if(index[str[i]-'a']==0)
{
index[str[i]-'a']=i; //記住該字母第一次出現時的索引
}
}
pos=strlen(str);
for(i=0;i<26;i++)
{
if(count[i]==1) //找到只出現一次的字母
{
if(index[i]!=-1&&index[i]<pos) //在只出現一次的字母中找出索引值最小的即可
{
pos=index[i];
}
}
}
if(pos<strlen(str))
return str[pos];
return '\0';
}