我在写这个程序时突然想起一个问题,就是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';
}