输出一串字符中第一个只出现一次的字符不能使用whilefor循环
//这是昨晚uc笔试的最后一道算是算法题吧.
</pre><pre code_snippet_id="346769" snippet_file_name="blog_20140515_3_1928683" name="code" class="cpp">//goto的写好了,预约了教练去练车了,递归的晚上回来再写。
</pre><pre code_snippet_id="346769" snippet_file_name="blog_20140515_5_893881" name="code" class="cpp">//输出一串字符中第一个只出现一次的字符 //如输入为abaccdff 输出b //不能使用库函数以及for/while循环 //其实一开始也想到用递归代替循环,但是后来想想好像goto也可以实现, //而且觉得goto比较简单,然后就用了goto //回来的时候感觉考官想考我们的不是goto,应该是想考我们的递归,我去,果断坑了 #include <iostream> #include <cctype> #include <string> using namespace std; int goTo(const char *str) { int i=0,j=1; int len=strlen(str);//获取长度 //不常用goto,都忘了格式了! loop: //当时忘记判断这一个了 if(i==j)//忘了判断不能自身比较了 { if(i==len-1)//这个也忘记判断了,当这是最后一个字符而且与前面都不同时 { cout<<str[i]<<endl; return 0; } j++; if(j==len)//如果str[i]已经和当前每一个都比较过了 { i++;//比较下一个 if(i==len)//如果没有下一个 return 1; } goto loop; } //if(strcmp(str[i],str[j])!=0)//逐个比较,如果不相等 //strcmp() 忘了这个是比较字符串的了 if(str[i]==str[j]) { i++;//比较下一个 j=0;//令j重置为0 //怎么我当时好像改成了j=i+1; if(i==len)//如果没有下一个 return 1; goto loop;//否则继续比较 } else { j++; if(j==len)//如果str[i]已经和当前每一个都比较过了 { //此时说明该字符只出现了一次 cout<<str[i]<<endl; return 0; } else goto loop;//否则继续下一次比较 } } int main() { char *s="cceef"; goTo(s); cin.get(); return 0; }
递归解法
//递归思想 //其实跟goto是一样的思想 //不过设多两个变量i,j用于指示要比较的字符和正在比较的字符传递给递归函数 #include <iostream> using std::cout; using std::endl; using std::strlen; using std::cin; #define ERROR '-1'//倘若没有任何一个匹配 char digui(const char *str,int i,int j) { int len=strlen(str); if(i==j)//如果i=j,则不与自身比较 { if(i==len-1)//但如果是i=j=len-1,说明最后一个只在最后出现了一次,输出 return str[i]; else//否则,跳过i=j,j++ { j++; digui(str,i,j);//进入下一次递归 } } else if(str[i]==str[j])//倘若一个字符出现两次 { //cout<<"i="<<i<<" "<<"j="<<j<<" "<<(int*)(&str[i])<<" "<<(int*)(&str[j])<<endl; i++;//进行下一个字符比较; if(i==len) { cout<<"没有一个只出现一次的字符"<<endl; return ERROR; } else { j=0;//重置j=0; digui(str,i,j); } } else//否则,移动j,继续比较,知道j=len; { j++; if(j==len)//如果比较到了最后都不相等 { //cout<<str[i]<<endl; return str[i]; } else//还没到最后 { digui(str,i,j); } } } int main() { char *s="cceet"; cout<<digui(s,0,0); cin.get(); return 0; }