3. 计算字符串中含有的不同字符的个数
编写一个函数,计算字符串中含有的不同字符的个数。字符在ASCII码范围内( 0~127,包括0和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次。
例如,对于字符串abaca唁,有a、b. c三种不同的字符,因此输出3。
数据范围: 1 <= n<=500
输入描述.
输入一行没有空格的字符串。
输出描述:
输入字符串中范围在(0~127,包括0和127)字符的种数。
输入:
abc
输出:
3
输入:
aaa
输出:
1
思路:
思路一(弃用):将输入的字符存入数组中,利用for循环初始化数组赋值为false;再重新遍历一次数组与输入的字符一一进行比较,第一次出现的字符标记为true;直到比较完成。
难点:不会写输入的字符怎么存,比较时候的字符怎么比较。
思路二: 根据题目要求字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 )。只需要维护一个大小为128的数组用来比较字符,让输入的字符作为数组下标,取出这个下标中辅助数组中的字符直接与输入的字符比较,如果相同则跳过,不同则赋值,让计数器+1,最后返回计数器即可。
具体实现:
#include <iostream>
#include <string>
using namespace std;
//获取字符串中去重后的字符个数
int Count_str(string str) {
int count = 0; // 计数器
char asc[128];// 辅助数组,记录当前字符是否已经出现过,初始每个元素为空
for (auto it : str) { // 遍历字符串
if (asc[int(it)] != it) {// 和辅助数组进行比较,首次出现不相等,否则是重复
asc[int(it)] = it;// 将首次出现的字符记录到辅助数组中
count++;// 计数器加1
}
}
return count;
}
int main() {
string str;
cin >> str;
int res1 = Count_str(str);
cout << "字符串中不同字符的个数为:" << res1 << endl;
}
运行结果:
abaaabbc
字符串中不同字符的个数为:3
时间复杂度:
时间复杂度 O(n)--- 遍历整个字符串,其中n为字符串长度
空间复杂度 O(1)--- 都是常数级的辅助变量,除此没有额外的辅助空间
4. 从键盘输入两个数字n,m,求解m和n的最小公倍数。
思路:
最小公倍数(Least Common Multiple,简称 LCM)指的是两个或多个整数公有的倍数中最小的一个。求两个数字n和m的最小公倍数可以按照以下步骤进行:
从键盘输入两个数字 n 和 m。 计算 n 和 m 的最大公约数(Greatest Common Divisor,简称 GCD)。 根据公式 LCM(n, m) = n * m / GCD(n, m) 计算 n 和 m 的最小公倍数。 输出结果。
具体实现:
// 求两个数的最小公倍数
int gcd(int a, int b) {
if (b == 0) {
return a;
}
else {
return gcd(b, a % b);
}
}
int main() {
int n, m, lcm;
cout << "请输入两个数字n和m:" << endl;
cin >> n >> m;
// 计算最小公倍数
lcm = n * m / gcd(n, m);
cout << n << "和" << m << "的最小公倍数为:" << lcm;
return 0;
}
运行结果:
请输入两个数字n和m:
6 7
6和7的最小公倍数为:42
复杂度:
时间复杂度:o(n)
空间复杂度O(1)