算法刷题小技巧【持续补充~】

03-01 1130阅读

🕺作者: 主页

算法刷题小技巧【持续补充~】
(图片来源网络,侵删)
我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux

😘欢迎 ❤️关注 👍点赞 🙌收藏 ✍️留言

文章目录

    • 前言
      • 使用scanf格式化读取数据
      • 输入字符串 getline
        • cin.getline() 使用举例
        • 两种getline函数
        • getline使用举例
        • 输入多行字符串(行数未知)
        • 截断字符串
        • 字符串转浮点数 stof函数
          • PAT甲级真题1108 求平均值
          • 输入格式
          • 输出格式
          • 数据范围
          • 输入样例1:
          • 输出样例1:
          • 输入样例2:
          • 输出样例2:
          • 题解
          • 对二维数组去重

            前言

            欢迎提供新技巧,可在评论区留言~

            使用scanf格式化读取数据

            eg:

            scanf("%d.%d.%d %d.%d.%d",&a,&b,&c,&d,&e,&f);
            //可以读取数据格式为1.2.4 2.14.15
            

            输入字符串 getline

            使用getline函数:

            cin.getline()也是常用的读取整行string的方式。

            getline()操作的对象是string,cin.getline()操作的对象的char数组

            cin.getline()函数读取至新行结尾或直到达到最大限制的整行文本。函数定义如下:

            // (buffer, stream_size, delimiter)
            istream& getline(char*, int size, char='\n')
            // The delimiter character is considered as '\n'
            istream& getline(char*, int size)
            
            1. 提取字符直到定界符。
            2. 将字符存储在缓冲区中。
            3. 提取的最大字符数为size-1。
            cin.getline() 使用举例
            #include  
            using namespace std; 
            int main() 
            { 
                char str[20]; 
                cin.getline(str, 20); 
                cout 
            	string s;
            	getline(cin, s);
            	cout 
            	if (str.size() == 0) break; //如果读取的是空,则读取结束
            	v.push_back(str);
            }
            
                int n;
                cin  n;
                int cnt = 0;    // 合法数字个数
                double sum = 0; // 合法数字总和
                while (n -- )
                {
                    string num;
                    cin >> num;
                    double x;
                    bool success = true;
                    /*
                    不加try catch报错terminate called after throwing an instance of 'std::invalid_argument' 
                    what():  stof(若传入不可转化为浮点型的字符串)会抛出异常
                    */
                    try
                    {
                        size_t idx = sizeof(num); // size type 用来记录大小的数据类型
                        x = stof(num, &idx);      // 字符串转换为float型
                        // stof判断"5.2abc"这类字符串时视"5.2"为合法,"abc"不合法,但实际上5.2abc不合法
                        if (idx  1000) success = false;
                    int k = num.find('.');
                    if (k != -1 && num.size() - k > 3) success = false;// 不超过2个小数位(最后一位是num.size()-1)
                    if (success) cnt ++, sum += x;
                    else printf("ERROR: %s is not a legal number\n", num.c_str());
                }
                if (cnt > 1) printf("The average of %d numbers is %.2lf\n", cnt, sum / cnt);
                else if (cnt == 1) printf("The average of 1 number is %.2lf\n", sum);
                else puts("The average of 0 numbers is Undefined");
                return 0;
            }
            

            对二维数组去重

                std::vector removeDuplicates(const std::vector& arr) {
                    std::vector sortedArr = arr;
                    // 对二维数组排序
                    std::sort(sortedArr.begin(), sortedArr.end());
                    // 去除重复项
                    auto last = std::unique(sortedArr.begin(), sortedArr.end());
                    sortedArr.erase(last, sortedArr.end());
                    return sortedArr;
                }
            

            在上述代码中,std::unique 函数用于去除连续的重复项,该函数位于 头文件中。函数的原型如下:

            template
            ForwardIt unique(ForwardIt first, ForwardIt last);
            

            其中,first 和 last 是表示要处理的元素范围的迭代器,ForwardIt 是一个泛型类型。std::unique 函数会返回一个指向最后一个不重复元素之后位置的迭代器。这意味着,从 first 到 last 的范围内的所有连续重复元素都被移到了范围的末尾,并且返回的迭代器指向了新范围的终点。

            在代码中,我们使用 std::unique 函数将数组 sortedArr 中的重复项移到了末尾,并将返回的迭代器保存在 last 变量中。然后,我们使用 erase 函数将重复项从数组中删除,其原型如下:

            template
            Iterator erase(Container& cont, Iterator pos);
            

            其中,cont 是容器,pos 是指向要删除元素位置的迭代器。erase 函数会从容器中删除指定位置的元素,并返回一个指向被删除元素之后位置的迭代器。

            在我们的代码中,sortedArr 是一个二维向量,我们使用 erase 函数将 last 到 sortedArr.end() 范围内的元素从 sortedArr 中删除,即删除了末尾的重复项。

            通过上述操作,我们使用 std::unique 函数和 erase 函数成功去除了二维数组中的连续重复项。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]