本人做了点拓展,入门有字符不重复则得到第一个不重复的字符,如果所有字符否重复,则找出最后一个重复。
实现方法:
1.定义一个int变量priority,记录出现重复的标志,其值越大,表示其对应出现重复情况的越晚,在程序中递加。
2.动态开辟两个存储空间空间:one is int[LEN] ,the other is char[LEN],(程序中对应pi[LEN],pc[LEN]).
3.检索源泉字符串,如果字符不存在pc中,将字符存入pc[i],同时在pi[i] = 1;//表示该字符出现且不重复。
反之,如果字符第一次重复则设置priority递加;再次重复则不做处理。直到字符串扫描结束。
4.找出pc[]中第一个不重复字符 或者最后重复的字符 。如果pi[]中有值=1,表示有字符不重负,如果没有,则表示
所有字符都存在重复情况,找出最后重复的字母(即pi[i]值最大的下标所对应pc[i]的值)就是最终要返回的值。
完毕,不多讲啦,因为在程序里面我已经做了很详细的注释啦!
程序代码:
//start code
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <assert.h>
//Constant
#define MAX 256
#define LIM 300
//fun
void inputString(char* pstr);
char handleString(char* pstr);
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char szstrSrc[MAX] = {""};
char* pstrSrc =szstrSrc;
char chresult;
assert(pstrSrc!=NULL);
/*输入字符串*/
inputString(pstrSrc);
cout<<"待测试字符串"<<pstrSrc<<" 长度:"<< strlen(pstrSrc)<< endl;
//判断字符串合法性
assert(strlen(szstrSrc)<=MAX && strlen(szstrSrc)> 0);
/*输出结果*/
chresult = handleString(szstrSrc);
cout<<"第一个不重复的或最后重复的字符:"<<chresult<<endl;
getchar();
getchar();
return 0;
}
// end code
void inputString(char* pstr)
{
int i = 0;
char szstrTemp[LIM]={""};
/*输入操作*/
cout<<"输入字符串,长度<=255:";
cin>>szstrTemp;
cout<<endl;
while(strlen(szstrTemp)>MAX-1)
{
cout<<"字符超长,请重新输入:";
cin>>szstrTemp;
cout<<endl;
}
for (i=0;i<MAX;i++)
{
if (szstrTemp[i]=='/0')
{
break;
}
else
{
pstr[i] = szstrTemp[i];
}
}
}
/*处理字符串,获取结果字符*/
char handleString(char* pstr)
{
int i = 0;
int j = 0;
char chtemp;
/*
//priority值越大表示其对应pc[i]出现重复情况越晚,
其pc[priority(最大值)]即使本代码最终结果
*/
static int priority = 1;
int resultIndex = 0;
/*最大优先级别,如果每个字符都重复MaxPRIORITY值对
应小标pc[MaxPRIORITY]未最终结果
*/
int MaxPRIORITY =1 ;
/*开辟临时空间*/
int const LEN = strlen(pstr);
char* pc = new char[LEN]; //记录字符(不重复)
/*字符出现次数记录=0表示没有出现
pi[i] = 0 //表示与其对应的pc[i] 没有字符出现;
pi[i] = 1 //表示该字母在strSource字符串出现一次,出现的字母 = pc[i];
pi[i] >1 //表示重复的字母在源字符串strSource中出现2次或以上,
多次出现只记录第一次,其值priority递加+1,—->
-->同一个字母多次出现只第一次给它设置priority;
*/
int* pi = new int [LEN];
/*清零动态分配内存*/
for (i=0;i<LEN;i++)
{
pc[i] = '/0';
pi[i] = 0; //所有priority清零
}
/* 记录不重复字母和其出现的次数,pc,pi下标一一对应,
比如pc[0] = a,pi[0]= a字母在strSource源字符串出现重复优先次数
*/
for (i=0;i<LEN;i++)
{
//外循环:取出源字符串中字符
for (j=0;j<LEN;j++)
{
/*内循环:取出源字符中字符与pc数组中(字符不重复)进行比较*/
if (pc[j] == pstr[i])
{
if (pi[j]==1)
{
/*该字符出现第二次,设置priority ID。
同一字符出现2次以上不执行此设置priority操作,
完成退出内循环,继续操作下一源字符
*/
priority = priority + 1;
pi[j] = priority;
}
break;
}
else
{
if (pc[j] == '/0')
{
/*该字符未出现过,存入pc中,置位出现标志pi[j] = 1,
推出内循环,继续操作下一源字符
*/
pc[j] = pstr[i];
pi[j] = 1;
break;
}
}
}
}
/*输出处理后的结果*/
cout<<"字符/t出现情况"<<endl;
for (i=0; i<LEN; i++)
{
if (pc[i]!='/0')
{
cout<<pc[i]<<"/t"<<pi[i]<<endl;
}
else
{
break;
}
}
/*挑选出最终结果输出结果*/
for (i = 0;i<LEN;i++)
{
/*如果有字符最先只出现一次,其为最终结果字符,选到结果退出*/
if (pi[i]!=0) //判断当前字符是否属无效字符,无效字符='/0',其pi[i] = 0
{
if (pi[i] == 1)
{
resultIndex = i;
break;
}
else
{
/*pi[i]>1重复出现了2次或以上,记录及值是否是当前最大*/
if (pi[i] > MaxPRIORITY)
{
MaxPRIORITY = pi[i]; //记录其大值
resultIndex = i; //存下其下标
continue;
}
}
}
}
chtemp = pc[resultIndex];
/*释放动态动态分配内存*/
delete []pi;
delete [] pc;
return chtemp;
}
//end code
运行结果1:
有字符不重复的情况结果:
所有字符都重复的情况结果:
以上我只测试了字母,字符串,数字加上特殊符号是没有问题的。
总结:
以上实现仅仅是提供一种实现的方式和方法,该方法缺点是如果里面出现的字符很多的时候,并且有汉字出现时候,需要比较很多次,效率不是很高。
如果仅仅是基本字符串(ASCII在0~128 之间)字符,应该是没有问题。
所以期望各位路过者多留心,有更好的实现方法和建议请留下。
+++++再次重声下:此题目为智乐软件c++笔试题目,最后一题技术题+++++++