输出一串字符中第一个只出现一次的字符/不能使用while/for循环

//这是昨晚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;

}




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值