【华为机试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

posted @ 2023-06-26 16:50  dayceng  阅读(21)  评论(0编辑  收藏  举报