C++机考试题

1、计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。并把每个单词输出并存储。
示例:
输入:hello nowcoder
输出:8
/*
知识点1:定义字符数组:
const int num = 5001;
char s[num]; //字符数组最后一个字符是不可见字符’\0’
cin.getline(s,num); //cin.getline(字符数组,字符个数,结束标志),第三个参数省略系统默认’\0’

知识点2:字符串流istringstream和ostringstream
istringstream,由 istream 派生而来,提供读 string 的功能
ostringstream,由 ostream 派生而来,提供写 string 的功能
stringstream,由 iostream 派生而来,提供读写 string 的功能
使用上述类时,要带上头文件:

#include <sstream>

代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

int getLengthofLastWord(string s)
{
    int ridx = s.rfind(' ');
    int len = s.size();
    int lastlen = len - 1 - ridx;
    return lastlen;
}

int main()
{
    string s1;
    //获取字符串
    getline(cin,s1); //因为有空格,所以要用getline()函数
    int rst=getLengthofLastWord(s1);
    cout << rst << endl;
    //存储每个单词
    vector<string> res;
    string out;
    stringstream stream(s1);
    while (stream >> out)
    {
        cout << out << endl;
        res.push_back(out);
    }
    return 0;
}

运行结果:
在这里插入图片描述
2、写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)
数据范围: n:[1,1000]
输入描述:
第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字符。
输出描述:
输出输入字符串中含有该字符的个数。(不区分大小写字母)
代码实现:

#include <iostream>
using namespace std;

int main()
{
    //输入字符数组
    const int num = 1001;
    char s1[num];
    cin.getline(s1,num);
    //输入字符
    char c1;
    cin >> c1;

    int cnt = 0;
    for (int i = 0; s1[i]!='\0'; i++)
    {
        if (toupper(s1[i])==toupper(c1))
        {
            cnt++;
        }
    }
    cout << cnt << endl;
    return 0;
}

运行结果:
在这里插入图片描述
3、随机生成N个1到500之间的随机数
输入描述:输入随机数个数N,并将这N个随机数输出,每行一个数
输出描述:将随机数从小到大排序后输出,每行一个
代码实现:

#include <iostream>
#include <vector>
#include <algorithm>  //使用sort需要引用该头文件
using namespace std;

int Random(int start,int end)
{
    int dis = end - start;
    return rand() % dis + start;
}

int main()
{
    int start = 1, end = 500;
    int N;
    cin >> N;

    vector<int> vec;
    int cnt = 0;
    for (int i = 0; i < N; i++)
    {
        cnt++;
        int tmp = Random(start,end);
        vec.push_back(tmp);
        cout << tmp << endl;
    }
    sort(vec.begin(), vec.end());  //默认升序排列,从小到大排序
    //reverse(vec.begin(), vec.end()); //降序排列,从大到小
    cout << "输出排序结果:" << endl;
    for (int i = 0; i < vec.size(); i++)
    {
        cout << vec[i] << endl;
    }
    return 0;
}

结果输出:
在这里插入图片描述
4、输入n个整数,找出其中最小的k个整数并按升序输出
数据范围:1≤n≤1000 ,输入的整数满足 1≤val≤10000
输入描述:
第一行输入两个整数n和k
第二行输入一个整数数组

输出描述:
从小到大输出最小的k个整数,用空格分开。
代码实现:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n, k;
    cin >> n >> k;
    vector<int> vec;
    const int max = 1000;
    int data[max] = { 0 };
    for (int i = 0; i < n; i++)
    {
        cin >> data[i];
        vec.push_back(data[i]);
    }
    sort(vec.begin(), vec.end());
    for (int i = 0; i < k; i++)
    {
        cout << vec[i]<<" ";
    }
    return 0;
}

运行结果:
在这里插入图片描述
5、输入整型数组和排序标识,对其元素按照升序或降序进行排序

数据范围: 1≤n≤1000 ,元素大小满足 0≤val≤100000
输入描述:
第一行输入数组元素个数
第二行输入待排序的数组,每个数用空格隔开
第三行输入一个整数0或1。0代表升序排序,1代表降序排序
输出描述:
输出排好序的数字
代码实现:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n, bl;
    cin >> n;

    const int N = 1000;
    static int aa[N];
    vector<int> vec;
    if ((n >= 1) && (n <= 1000))
    {
        for (int i = 0; i < n; i++)
        {
            cin >> aa[i];
            vec.push_back(aa[i]);
        }

    }
   
    cin >> bl;
    if (bl == 0)
    {
        sort(vec.begin(), vec.end());
    }
    if (bl == 1)
    {
        sort(vec.begin(), vec.end());
        reverse(vec.begin(),vec.end());
    }

    int sz = vec.size();
    for (int i = 0; i < sz; i++)
    {
        cout << vec[i] << " ";
    }

    return 0;
}

运行结果:
在这里插入图片描述
6、输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;
长度不是8的整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(每个字符串长度小于等于100)
输出描述:
依次输出所有分割后的长度为8的新字符串
代码实现:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    string str;
    while (cin >> str)
    {
        int len = str.size();
        if (len > 100)
        {
            cout << "请输入小于100的字符" << endl;
        }
        else
        {
            vector<string> vect;
            int m = len / 8;
            for (int i = 0; i < m; i++)
            {
                vect.push_back(str.substr(i*8,8));
            }
            if (len % 8 != 0)
            {
                int tt = 8 - len % 8;
                for (int i = 0; i < tt; i++)
                {
                    str += '0';
                }
                vect.push_back(str.substr(m * 8));
            }  //if(len%8)

            vector<string>::iterator it;
            for (it = vect.begin(); it != vect.end(); ++it)
            {
                cout << *it << endl;
            }
        }  //else   
    }  //while()

    return 0;
}

运行结果:
在这里插入图片描述
7、HJ5进制转换
接受一个十六进制的数,输出该数值的十进制表示。

数据范围:保证结果在 1≤n≤pow(2,31)−1
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
代码实现:

#include <iostream>
using namespace std;

int main()
{
    int a;
    while (cin >> hex >> a) {
        cout << a << endl;
    }
}

运行结果:
在这里插入图片描述
8、HJ6质数因子
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )

数据范围: 1≤n≤2×pow(10,9) +14
输入描述:
输入一个整数

输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
代码实现:

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    for (int i = 2; pow(i, 2) <= n; i++)
    {
        if (n % i == 0)
        {
            cout << i << " ";
            n /= i;
            i--;
        }
    }
    cout << n;
    return 0;
}

运行结果:
在这里插入图片描述
9、HJ8合并记录表
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。

提示:
0 <= index <= 11111111
1 <= value <= 100000
输入描述:
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开

输出描述:
输出合并后的键值对(多行)
代码实现:
主要用到STL标准库中的map关联容器,它提供一对一的Hash。
1)第一个为关键字key,每个关键字只能在map中出现一次。
2)第二个称为该关键字的值。
map以模板(泛型)的方式实现,可以存储任意类型的数据,定义及使用方法如下代码所示:

#include <iostream>
#include <map>  //STL头文件没有扩展名.h

using namespace std;

int main()
{
    int num,key,value;
    map<int, int> mp;
    cin >> num;
    while (num)
    {
        cin >> key >> value;
        //count()方法返回值是一个整数,1表示有这个元素,0表示没有这个元素,以此来判断键值元素是否存在
        if (mp.count(key))
        {
            mp[key] += value;
        }
        else
        {
            mp.insert(pair<int, int>(key, value));  //插入元素
        }
        num--;
    }

    map<int, int>::iterator it; //迭代器
    for (it = mp.begin(); it != mp.end(); it++)
    {
        cout << it->first << " " << it->second << endl;
    }

    return 0;
}

运行结果:
在这里插入图片描述
10、HJ3明明的随机数
明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
数据范围:1≤n≤1000,输入的数字大小满足 1≤val≤500
输入描述:
第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。
输出描述:
输出多行,表示输入数据处理后的结果
代码实现:

#include <iostream>
#include <vector>
#include <algorithm>  //使用sort需要引用该头文件
using namespace std;


int main()
{
    int num;
    cin >> num;

    vector<int> vec(num);  //num表示
    for (int i = 0; i < num; i++)
    {
        cin >> vec[i];
    }

    sort(vec.begin(), vec.end());
    /*unique只移除相邻元素,如果要移除所有重复元素,则需要先将数据进行排序,使重复元素相邻
    unique()会返回一个迭代器*/
    vector<int>::iterator it= unique(vec.begin(), vec.end());
    vec.erase(it,vec.end());

    //排序后输出
    int len = vec.size();
    for (int i = 0; i < len; i++)
    {
        cout << vec[i] << endl;
    }
    return 0;
}

运行结果如下:
在这里插入图片描述
11、HJ10字符个数统计
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
数据范围: 1≤n≤500
输入描述:
输入一行没有空格的字符串。
输出描述:
输出 输入字符串中范围在(0~127,包括0和127)字符的种数。
代码实现:

#include <iostream>
#include <vector>
#include <algorithm>  //find()函数位于该头文件内
using namespace std;

int charNum(string str)
{
    int cnt = 0;
    int len = str.length();

    vector<char> vec;
    for (int i = 0; i < len; i++)
    {
        if (find(vec.begin(), vec.end(), str[i]) == vec.end())
        {
            vec.push_back(str[i]);
        }
    }
    cnt = vec.size();
    return cnt;
}

int main()
{
    string str;
    cin >> str;
    
    int num=charNum(str);
    cout << num << endl;

    return 0;
}

运行结果:
在这里插入图片描述
12、HJ11 数字颠倒
描述
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
数据范围: 0≤n≤pow(2,30)−1
输入描述:
输入一个int整数
输出描述:
将这个整数以字符串的形式逆序输出
代码实现:

#include <iostream>
#include <sstream>
using namespace std;

int main()
{
    int num;
    cin >> num;

    stringstream ss;
    string res;

    while (num / 10 != 0)
    {
        ss << num % 10;
        num /= 10;
    }
    ss << num % 10;  //向流中写入数据
    ss >> res;  //读出流中的数据
    cout << res << endl;
    
    return 0;
}

运行结果:
在这里插入图片描述
13、HJ12字符串反转
描述
接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

输入描述:
输入一行,为一个只包含小写字母的字符串。

输出描述:
输出该字符串反转后的字符串。

代码实现:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    string str;
    getline(cin, str);
    //字符反转
    reverse(str.begin(), str.end());  //位于头文件#include<algorithm>
    cout << str << endl;
    
    return 0;
}

运行结果:
在这里插入图片描述
14、HJ13句子逆序
描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”

所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

数据范围:输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000

注意本题有多组输入
输入描述:
输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。

输出描述:
得到逆序的句子
代码实现:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    string str;
    getline(cin, str);
    
    stringstream stream(str);
    string out;
    vector<string> vec;
    while (stream >> out)
    {
        vec.push_back(out);
    }
    reverse(vec.begin(),vec.end());
    int len = vec.size();
    for (int i = 0; i < len; i++)
    {
        cout << vec[i] << " ";
    }
    
    return 0;
}

运行结果:
在这里插入图片描述
15、HJ14字符串排序
描述
给定 n 个字符串,请对 n 个字符串按照字典序排列。
数据范围: 1≤n≤1000 ,字符串长度满足 1≤len≤100
输入描述:
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
输出描述:
数据输出n行,输出结果为按照字典序排列的字符串。
代码实现:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int N;
    cin >> N;

    vector<string> vec;
    const int max = 1000;
    static string data[max];
    for (int i = 0; i < N; i++)
    {
        cin >> data[i];
        vec.push_back(data[i]);
    }

    sort(vec.begin(), vec.end());

    int len = vec.size();
    for (int i = 0; i < len; i++)
    {
        cout << vec[i] << endl;
    }
    return 0;
}

运行结果:
在这里插入图片描述
16、HJ15 求int型正整数在内存中存储时1的个数
描述
输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。
数据范围:保证在 32 位整型数字范围内
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
代码实现:

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;

    int cnt = 0;

    while (n != 0)
    {
        if (n % 2 != 0) cnt++;
        n >>= 1;
    }
    cout << cnt << endl;
    return 0;
}

运行结果:
在这里插入图片描述
17、HJ108求最小公倍数
描述
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

数据范围:1≤a,b≤100000
输入描述:
输入两个正整数A和B。

输出描述:
输出A和B的最小公倍数。
代码实现:

#include <iostream>
#include <string>
using namespace std;

//计算最大公约数:greatest common divisor
int gcd(int a, int b)
{
    int c = 0;
    while (c = a % b)
    {
        a = b;
        b = c;
    }
    return b;
}
//计算最小公倍数:least common multiple
int lcm(int a, int b)
{
    int tmp = a * b / gcd(a, b);
    return tmp;
}

int main()
{
    int a, b;
    cin >> a >> b;

    int min = lcm(a, b);
    cout << min << endl;
    return 0;
}

运行结果:
在这里插入图片描述
18、HJ106 字符逆序
描述
将一个字符串str的内容颠倒过来,并输出。
数据范围:1≤len(str)≤10000
输入描述:
输入一个字符串,可以有空格
输出描述:
输出逆序的字符串
代码实现:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str; 
    getline(cin, str);

    int len = str.length();
    for (int i = len-1; i >= 0; i--)
    {
        cout << str[i];
    }
    return 0;
}

运行结果:
在这里插入图片描述
19、HJ102字符统计
描述
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。
数据范围:字符串长度满足 1≤len(str)≤1000
输入描述:
一个只包含小写英文字母和数字的字符串。
输出描述:
一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
知识点:
vector初始化方式:

vector<int>vec0;                                //默认初始化,vec0为空
vector<int>vec1{1,2,3};                         //直接赋值
vector<int>vec2(vec1);                          //用vec1初始化vec2
vector<int>vec3(vec1.begin(), vec1.end());      //用vec1初始化vec3
vector<int>vec4(10);                            //10个值为0的元素
vector<int>vec5(10,4);                          //10个值为4的元素
vector<vector<int>>vec6(10, vector<int>(4, 1)); //10*4的二维数组,值全为1

代码实现:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
//define struct
struct dat
{
    int num;
    char ch;
};
//定义排序规则
bool sort1(dat & d1, dat & d2)
{
    if (d1.num == d2.num)
    {
        return d1.ch < d2.ch;
    }
    else
    {
        return d1.num > d2.num;
    }
}
int main()
{
    string str; 
    getline(cin, str);

    //初始化vector,256个值为0的元素,用来保存每个字符的数量
    vector<int> char_num(256, 0); 
    vector<dat> charN;//用来保存对应的某个字符以及数量

    //遍历字符串中每个字符出现的次数
    int len = str.length();
    for (int i = 0; i < len; i++)
    {
        char_num[str[i]]++;
    }

    for (int i = 0; i < 256; i++)
    {
        dat tmp;
        tmp.ch = i;
        tmp.num = char_num[i];
        charN.push_back(tmp);
    }
    //按照字符数量进行排序,数量相同字典序小的在前
    sort(charN.begin(), charN.end(), sort1);
    int sz = charN.size();
    for (int i = 0; i < sz; i++)
    {
        if (charN[i].num == 0) break;
        cout << charN[i].ch;
    }
    return 0;
}

运行结果:
在这里插入图片描述
20、HJ100等差数列
描述
等差数列 2,5,8,11,14…
(从 2 开始的 3 为公差的等差数列)
输出求等差数列前n项和

数据范围: 1≤n≤1000
输入描述:
输入一个正整数n。
输出描述:
输出一个相加后的整数。
代码实现:

#include <iostream>
using namespace std;
int main()
{
    int sum = 0;
    int a1 = 2;
    int n;
    cin >> n;
    while (n--)
    {
        sum += a1;
        a1 += 3;
    }
    cout << sum << endl;
    return 0;
}

运行结果:
在这里插入图片描述
21、HJ99自守数
描述
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:2525= 625,7676 = 5776,9376*9376 = 87909376。请求出n(包括n)以内的自守数的个数
数据范围: 1≤n≤10000
输入描述:
int型整数
输出描述:
n以内自守数的数量
代码实现:

#include <iostream>
using namespace std;

int main()
{
    int base = 10;
    int tmp = 1;
    int n;
    cin >> n;
    for (int i = 1;i <= n; i++)
    {
        int sq = i*i;
        if (i == base) base *= 10;
        if (sq % base == i) tmp++;
    }
    cout << tmp << endl;
    return 0;
}

运行结果:
在这里插入图片描述
22、HJ23 删除字符串中出现次数最少的字符
描述
实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
数据范围:输入的字符串长度满足 1≤n≤20 ,保证输入的字符串中仅出现小写字母
输入描述:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出描述:
删除字符串中出现次数最少的字符后的字符串。
代码实现:

#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
    string s;
    const int num = 26;
    while (cin >> s)
    {
        int cnt[num] = { 0 };
        //将每个字符出现的次数对应的放在cnt数组中
        int len = s.size();
        for (int i = 0; i <len ; i++)
        {
            int tmp = int(s[i] - 'a');
            cnt[tmp]++;
        }
        //找到最小次数的字符并删除
        int min = 100;
        for (int i = 0; i < num; i++)
        {
            if ((cnt[i] != 0) && (cnt[i] < min))
            {
                min = cnt[i];
            }
        }
        //删除最小字符
        for (int i = 0; i < num; i++)
        {
            if (min == cnt[i])
            {
                s.erase(remove(s.begin(), s.end(), 'a' + i), s.end());
            }
        }
        cout << s << endl;
    }
    return 0;
}

运行结果:
在这里插入图片描述
知识点:vector::remove()函数的使用

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    vector<int> vec = {1,1,2,3,4,5,6,7,8,9 };
    remove(vec.begin(), vec.end(), 1);
    for (int i = 0; i < vec.size(); i++)
    {
        cout << vec[i] << " ";
    }
    return 0;
}

运行结果如下:在这里插入图片描述
在这里插入图片描述
remove()函数的功能就是将vector中指定的数据移动到vector末尾,注意,上述代码remove将两个1移动到末尾,但是在vector中并不显示出来,也就是说不能输出,但是内存中却存在这个数,需要使用erase才能彻底删除,使用方法如下:

vec.erase(remove(vec.begin(), vec.end(), 1), vec.end());

运行结果如下:在这里插入图片描述23、HJ31 单词倒排
描述
对字符串中的所有单词进行倒排。
说明:
(1)构成单词的字符只有26个大写或小写英文字母;
(2)非构成单词的字符均视为单词间隔符;
(3)要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
(4)每个单词最长20个字母;
数据范围:字符串长度满足 1≤n≤10000
输入描述:
输入一行,表示用来倒排的句子
输出描述:
输出句子的倒排结果
代码实现:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main() {
	string str;
	while (getline(cin, str)) 
	{
		vector<string>svec;
		svec.clear();
		string temp = "";
		for (int i = 0; i < str.size(); ++i) 
		{
			if (str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z')
				temp += str[i];
			else {
				if (temp.size() > 0) {
					svec.push_back(temp);
					temp = "";
				}
			}
		}
		if (temp.size() > 0)
			svec.push_back(temp);
		// 逆序输出
		int len = svec.size();
		for (int i = len - 1; i >= 0; --i)
			cout << svec[i] << ' ';
	}
	return 0;
}

运行结果如下:
在这里插入图片描述
24、HJ97 记负均正
描述
首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
0即不是正整数,也不是负数,不计入计算。如果没有正数,则平均值为0。

数据范围: 1≤n ≤2000 ,输入的整数都满足 ∣val∣≤1000
输入描述:
首先输入一个正整数n,
然后输入n个整数。
输出描述:
输出负数的个数,和所有正整数的平均值。

代码实现:

#include<iostream>
#include<iomanip>
using namespace std;
int main() 
{
	int N;
	cin >> N;

	int pos = 0, neg = 0, sum = 0;
	for (int i = 0; i < N; i++)
	{
		int tmp;
		cin >> tmp;
		
		if (tmp > 0)
		{
			pos++;
			sum += tmp;
		}
		else if (tmp < 0)
		{
			neg++;
		}
	}

	float mean;
	if (pos == 0)
	{
		mean = 0.0;
	}
	else
	{
		mean = sum * 1.0 / pos;
	}
	cout << neg<<" "<< fixed << setprecision(1) << mean << endl;
	return 0;
}

运行结果:
在这里插入图片描述
25、HJ40 统计字符
描述
输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数。
数据范围:输入的字符串长度满足 1≤n≤1000
输入描述:
输入一行字符串,可以有空格
输出描述:
统计其中英文字符,空格字符,数字字符,其他字符的个数

代码实现:

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string str;
    getline(cin, str);
    int cnt_word = 0, cnt_blank = 0, cnt_num = 0, cnt_other = 0;
    int sz = str.size();
    for (int i = 0; i < sz; i++)
    {
        if (str[i] >= '0' && str[i] <= '9') 
        {
            cnt_num++;
        }
        else if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
        {
            cnt_word++;
        }
        else if (str[i] == ' ')
        {
            cnt_blank++;
        }
        else
        {
            cnt_other++;
        }
    }
    cout << cnt_word << endl;
    cout << cnt_blank << endl;
    cout << cnt_num << endl;
    cout << cnt_other << endl;
    return 0;
}

运行结果:
在这里插入图片描述
26、HJ51 输出单向链表中倒数第k个结点
描述
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
正常返回倒数第k个结点指针,异常返回空指针.
要求:
(1)正序构建链表;
(2)构建后要忘记链表长度。
数据范围:链表长度满足1≤n≤1000 ,k≤n ,链表中数据满足 0≤val≤10000
本题有多组样例输入。
输入描述:
输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值
输出描述:
输出一个整数

代码实现:

#include <iostream>
using namespace std;

//链表节点
struct ListNode
{
    int val;
    ListNode* next;
    //初始化
    ListNode(int x):val(x), next(NULL) {}
};

//找到链表倒数第k个节点
ListNode* FindKthToTail(ListNode* pHead, int k) {
    int n = 0;
    ListNode* fast = pHead;
    ListNode* slow = pHead;
    //快指针
    for (int i = 0; i < k; i++) {
        if (fast != NULL)
            fast = fast->next;
        else
            //达不到k,说明链表长度过短,返回空链表
            return slow = NULL;
    }
    //快慢指针同步,快指针先到底,慢指针指向倒数第k个元素
    while (fast != NULL) 
    {
        fast = fast->next;
        slow = slow->next;
    }
    return slow;
}

int main()
{
    int n, val;
    //输入n个节点
    while (cin >> n) {
        cin >> val;
        //输入链表第一个节点
        ListNode* head = new ListNode(val);
        ListNode* p = head;
        //输入链表后续节点
        for (int i = 1; i < n; i++)
        {
            cin >> val;
            ListNode* q = new ListNode(val);
            //连接
            p->next = q;
            p = p->next;
        }
        //找到第k个位置
        int k;
        cin >> k;
        //边界条件如果等于0直接返回0
        if (k == 0)
            cout << 0 << endl;
        else {
            //找到第k个节点
            p = FindKthToTail(head, k);
            //只有返回不NULL才输出
            if (p != NULL)
                cout << p->val << endl;
        }
    }
    return 0;
}

运行结果:
在这里插入图片描述


版权声明:本文为lindamtd原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。