【数据结构机试复习1】 字符串反转 & 字符流中第一个不重复的字符

EX1:字符串反转

给定一个字符串,你需要颠倒一个句子中每个单词中的字符顺序,同时保留空格和初始单词顺序。

输入:Let's take the contest

输出:s'teL ekat eht tsetnoc

#include <iostream>
#include <string>
#include <algorithm>  //3.用到reverse()
using namespace std;

string reverseWords(string s){
	if (s.size() == 0) return""; //1.若字符为空,返回空字符
	int key = 0;
	for (int i = 0; i < s.size(); i++) { //2.返回字符长度用size(),而不是length()
		if (s[i] == ' '){            //其实length()也可以...之前应该搞错了,效果是一样的
			reverse(s.begin() + key, s.begin() + i); //4.reverse(i,j),则反转的范围是[i,j)
			key = i + 1;                             //即不包含j
		}
	}
	reverse(s.begin() + key, s.end()); //5.begin()返回一个迭代器,指向字符串的第一个元素
	return s;                          //而end()指向字符串最后一个字符的下一位置
}

int main() {
	string s;
	getline(cin, s);   //6.因为单词之间有空格,所以要用getline
	cout<<reverseWords(s);
	return 0;
}


EX 2:字符流中第一个不重复的字符

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

若不存在,则输出“#”。

#include <iostream>
#include <string>
using namespace std;

int main() {
	int mark[128] = {}; //每个字符出现的次数初始化为0
	char buffer[128];  //记录字符顺序
	string str;
	getline(cin, str); //可能有空格,所以用getline
	int i = 0, k = 0, index;
	while (str[i] != '\0') {
		index = str[i] - '\0';
		if (mark[index] == 0) { //若未出现过
			buffer[k++] = str[i]; //加到buffer数组中
		}
		i++;
		mark[index]++; //出现次数+1
	}

	for (int j = 0; j<k; j++) {
		index = buffer[j] - '\0';
		if (mark[index] == 1) { //只出现了1次
			cout << buffer[j];
			break;
		}
		else if (j == k - 1) cout << "#";
	}
	return 0;
}
主要思想:

1、mark[128] 数组,用来标记每个字符出现的次数。其中,数组的下标为字符的ascii码,也就是通过字符减去‘\0’(ascii码为0)得到的index。

2、buffer[128] 数组,用来记录每个字符出现的顺序;如果读取的字符出现的次数为0,则将字符加入到buffer中。

3、每读取一个字符,增加mark[index]的值。

4、读取完成之后,遍历buffer,若出现了mark值为1的字符,输出即可;否则直到k-1仍未找到符合要求的字符,则输出“#”。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值