zoukankan      html  css  js  c++  java
  • 数据结构与算法题目集(中文)7-47 打印选课学生名单 (25分) (一对多结构使用vector向量数组+string、char*相互转换)

    1.题目

    假设全校有最多40000名学生和最多2500门课程。现给出每个学生的选课清单,要求输出每门课的选课学生名单。

    输入格式:

    输入的第一行是两个正整数:N(≤40000),为全校学生总数;K(≤2500),为总课程数。此后N行,每行包括一个学生姓名(3个大写英文字母+1位数字)、一个正整数C(≤20)代表该生所选的课程门数、随后是C个课程编号。简单起见,课程从1到K编号。

    输出格式:

    顺序输出课程1到K的选课学生名单。格式为:对每一门课,首先在一行中输出课程编号和选课学生总数(之间用空格分隔),之后在第二行按字典序输出学生名单,每个学生名字占一行。

    输入样例:

    10 5
    ZOE1 2 4 5
    ANN0 3 5 2 1
    BOB5 5 3 4 2 1 5
    JOE4 1 2
    JAY9 4 1 2 5 4
    FRA8 3 4 2 5
    DON2 2 4 5
    AMY7 1 5
    KAT3 3 5 4 2
    LOR6 4 2 4 1 5
    

    输出样例:

    1 4
    ANN0
    BOB5
    JAY9
    LOR6
    2 7
    ANN0
    BOB5
    FRA8
    JAY9
    JOE4
    KAT3
    LOR6
    3 1
    BOB5
    4 7
    BOB5
    DON2
    FRA8
    JAY9
    KAT3
    LOR6
    ZOE1
    5 9
    AMY7
    ANN0
    BOB5
    DON2
    FRA8
    JAY9
    KAT3
    LOR6
    ZOE1

    2.题目分析

    1.数据结构使用vector<string> list[2501]; (参见https://blog.csdn.net/chen_zan_yu_/article/details/84671823

    2.注意结尾的c_str()函数,因为使用printf输出string类型是不OK的(C语言没有string)而cout又会超时,所以将string转换为char*是用c_str()函数

    具体用法:(参见https://blog.csdn.net/u013682388/article/details/39547773#

    //标准库的string类提供了三个成员函数来从一个string得到c类型的字符数组
    //主要介绍c_str
    //c_str():生成一个const char*指针,指向以空字符终止的数组。
    //这个数组应该是string类内部的数组
    #include <iostream>
    //需要包含cstring的字符串
    #include <cstring>
    using namespace std;
     
    int main()
    {
    	//string-->char*
    	//c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同
     
    	//这个数组的数据是临时的,当有一个改变这些数据的成员函数被调用后,其中的数据就会失效。
    	//因此要么现用先转换,要么把它的数据复制到用户自己可以管理的内存中
    	const char *c;
    	string s = "1234";
    	c = s.c_str();
    	cout<<c<<endl;
    	s = "abcde";
    	cout<<c<<endl;
    }

    其实上面的c = s.c_str(); 不是一个好习惯。既然c指针指向的内容容易失效,我们就应该按照上面的方法,那怎么把数据复制出来呢?这就要用到strcpy等函数(推荐)。

    //标准库的string类提供了三个成员函数来从一个string得到c类型的字符数组
    //主要介绍c_str
    //c_str():生成一个const char*指针,指向以空字符终止的数组。
    //这个数组应该是string类内部的数组
    #include <iostream>
    //需要包含cstring的字符串
    #include <cstring>
    using namespace std;
     
    int main()
    {
    	//更好的方法是将string数组中的内容复制出来 所以会用到strcpy()这个函数
    	char *c = new char[20];
    	string s = "1234";
    	// c_str()返回一个客户程序可读不可改的指向字符数组的指针,不需要手动释放或删除这个指针。
    	strcpy(c,s.c_str());
    	cout<<c<<endl;
    	s = "abcd";
    	cout<<c<<endl;
    }

     3.代码

    #include<iostream>
    #include<vector>
    #include<string>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    vector<string> list[2501];
    int main()
    {
    	int n, k;
    	cin >> n >> k;
    	for (int i = 0; i < n; i++)
    	{
    		char name[5];
    		scanf("%s", name) ;
    		int amount;
    		scanf("%d",&amount);
    		for (int j = 0; j < amount; j++)
    		{
    			int classnum;
    			scanf("%d", &classnum);
    			list[classnum].push_back(name);
    		}
    	
    	}
    	for (int i = 1; i <=k; i++)
    	{
    		sort(list[i].begin(), list[i].end());
    		printf("%d %d
    ", i, list[i].size());
    		for (int j=0;j<list[i].size();j++)
    		{
    			printf("%s
    ", list[i][j].c_str());//注意这里!!
                //cout<<list[i][j]<<endl;
    		}
    	}
    
    
    }

    4.附string、char*相互转换方法

    (参见、https://blog.csdn.net/johnisjohn/article/details/86993462

    1.string转char*

    方式一:
    
    string str = "some string" ;
    char *cstr = &str[0];
    
    方式二:
    
    std::string str = "string";
    const char *cstr = str.c_str();
    
    
    //c_str()返回了一个指向常量数组的指针, 需常量修饰符 const
    //str 被定义为常量指针 
    const char *str = s1.c_str();
    

    2.char*转string

    方式一:直接赋值
    
     //string 类型能够自动将 C 风格的字符串转换成 string 对象, 因此 直接赋值即可:
    string s1; 
    const char *pc = "a character array"; //加不加const都行
    s1 = pc; // ok 
    
    
    
  • 相关阅读:
    MySQL查询今天/昨天/本周、上周、本月、上个月份数据的sql代码
    lumen 登陆 注册 demo
    Maven与Ant的区别
    Java中String为什么是final
    一天一点MySQL复习——获取数据库系统时间、变量赋值、变量比较
    一天一点MySQL复习——存储过程
    Mybatis学习——传递Map型参数
    Java修饰符
    RegEx正则表达式学习笔记
    一天一个Java基础——通过异常处理错误
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788990.html
Copyright © 2011-2022 走看看