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仍未找到符合要求的字符,则输出“#”。