【蓝蓝计算机考研算法】-day02-计算字符串含有不同个数&求m与n的最小公倍数

194 阅读2分钟

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
67的最小公倍数为:42

复杂度:

时间复杂度:o(n)
空间复杂度O(1)