【华为机试ACM基础#01】字符串最后一个单词长度、计算某字符出现次数、提取不重复的整数(熟悉字符/字符串/整数的输入)
字符串最后一个单词的长度
描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
示例1
输入:hello nowcoder
输出:8
说明:最后一个单词为nowcoder,长度为8
思路
从后向前遍历字符串并计数,当第一次遇到空格就停止遍历,返回此时的计数变量即可
代码
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;//用于保存输入字符串
getline(cin, s);//用于从输入流读取一行文本
int lenCount = 0;
for(int i = s.size() - 1; i >= 0; --i){
if(s[i] != ' ') ++lenCount;
if(lenCount != 0 && s[i] == ' ') break;
}
cout << lenCount << endl;
// printf("%d",lenCount);//用哪种输出都行
return 0;
}
注意,从后往前遍历可能会先遇到空格,因此我们需要注意末尾的空格
(由LeetCode用例s = " fly me to the moon "得到的教训)
计算某字符出现次数
描述
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)
数据范围: 1≤n≤1000
输入描述
第一行输入一个有字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为空格)。
输出描述
输出输入字符串中含有该字符的个数。(不区分大小写字母)
示例1
输入:ABCabc
A
输出:2
思路
先将输入字符和字符串都转成小写,然后比较即可,相同就计数
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
using namespace std;
int main(){
string s;
getline(cin, s);
char target;
cin >> target;
target = tolower(target);//将目标字符转换为小写
transform(s.begin(), s.end(), s.begin(), ::tolower);//将目标字符串转换为小写
int count = 0;
for(int i = 0; i < s.size(); i++){
if(s[i] == target) count++;
}
cout << count << endl;
return 0;
}
知识点:
include
包含了一些用于字符分类和转换的函数。常见的函数有:
- isalnum(char c):判断字符 c 是否为字母或数字。
- isalpha(char c):判断字符 c 是否为字母。
- isdigit(char c):判断字符 c 是否为数字。
- isspace(char c):判断字符 c 是否为空白字符(空格、制表符、换行符等)。
- tolower(char c):将字符 c 转换为小写字母。
- toupper(char c):将字符 c 转换为大写字母。
提取不重复的整数
输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
保证输入的整数最后一位不是 0
数据范围: 1≤n≤108
输入描述:输入一个int型整数
输出描述:按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
思路
用哈希表(数组)呗,不断的对输入整数进行除10操作,每次除完之后通过取模的方式拿到个位数
检查该数在哈希数组中是否没有记录,没有就更新记录并将其用于计算最终的输出结果
计算方式为反转数字(reverse number)算法,类似方法在复原IP地址中也使用过
#include <iostream>
using namespace std;
int main() {
int num;
cin >> num;
int res = 0;
int arr[10] = {0};
while(num){
if(arr[num % 10] == 0){//该值未出现过
arr[num % 10]++;//更新记录
res = res * 10 + num % 10;//计算之后的返回值
}
num /= 10;
}
cout << res << endl;
}
输入输出总结
ACM下关于字符串/字符/整数的输入有:
#include <iostream>
#include <string>
//获取一行字符串输入
string s;//用于保存输入字符串
getline(cin, s);//用于从输入流读取一行文本
string s;
cin >> s;
//获取一个字符输入
char c;
c = cin.get();
//获取一个整数输入
int a;
cin >> a;
输出一般就用cout即可,也可以用printf