33,010
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
//该函数返回第一个不重复字符的下标位置
size_t find_first_no_dup(const char *str,size_t len);
/*因为字符可以将其看作是无符号整数,8bits
范围为0~255.静态全局变量,编译时清零。
这里假设了每个字符最多出现0~2^16-1次.
*/
struct Infor
{
unsigned short c;//字符出现的次数
size_t index;//字符第一次出现的下标
};
static Infor a[256];
int main()
{
const char *ch="weeewfdfdipl";
cout<<ch[find_first_no_dup(ch,strlen(ch))]<<endl;
return 0;
}
size_t find_first_no_dup(const char *str,size_t len)
{
/*
利用桶排序的思想,借用256*8=2KB的空间,统计每一个字符出现的次数
*/
for(size_t i=0;i!=len;++i)
{
a[str[i]].c++;
if(a[str[i]].c==1)//该字符是第一次出现
a[str[i]].index=i;
}
//扫描大小为256的数组
size_t ret=len;
for(int k=0;k!=256;++k)
{
if(a[k].c==1)//只处理出现一次的字符
{
if(a[k].index<ret)
ret=a[k].index;
}
}
return ret;
}
/*不知道满足楼主题意不?原数组我确实只扫描了一遍,但是要得出结果还必须扫描大小256
的数组。我认为我的方法比Hash更节省空间。
*/
<script type="text/javascript">
var str="abc123c2a0ef3";
var t={},arr=str.split('');
for(var i=0,l=arr.length;i<l;i++){
if(str.split(arr[i]).length==2){
break;
alert("第一个不重复的字符是:"+arr[i]);
}
}
</script>
<script type="text/javascript">
var str="abc123c2a0ef3";
var t={},arr=str.split('');
for(var i=0,l=arr.length;i<l;i++){
if(t[arr[i]]===true){
break;
alert("第一个重复的字符是:"+arr[i]);
}else{
t[arr[i]]=true;
}
}
</script>