zoukankan      html  css  js  c++  java
  • 杭电2025 查找最大元素

      链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2025

      题目的意思很简单,应该不是什么大问题。然后因为最近在练习STL的用法,所以就想用链表来完成插入的操作。然后附上用STL写的代码:

    #include <iostream>
    #include<math.h>
    #include <iomanip>
    #include<cstdio>
    #include<string>
    #include<map>
    #include<vector>
    #include<list>
    #include<algorithm>
    #include<stdlib.h>
    #include<iterator>
    using namespace std;
    
    
    int main()
    {
       string input;
       //int n;
      // cin>>n;
       //
       while(getline(cin,input))
       {
           //cin.get();
           int len1=input.size();
    
           list<char>word;
    
           list<int>num;
           for(int i=0;i<len1;i++)
           {
               word.push_back(input[i]);//把读到的字符串全部放到链表中
                //num.push_back((int)input[i]);
           }
            list<char>::iterator pr;
            list<char>::iterator pr2;
            pr=max_element(word.begin(),word.end());//找到最大元素的下标;
    
            char big;
            big=*pr;
             pr=word.begin();
            pr2=word.begin();
    
    
            for(pr=word.begin();pr!=word.end();pr++)
            {
                if(*pr==big)
                {
    
                     pr2=++pr;
    
                    word.insert(pr2,'(');
    
                    word.insert(pr2,'m');
    
                    word.insert(pr2,'a');
    
                    word.insert(pr2,'x');
    
                    word.insert(pr2,')');
    //因为链表在插入过程中迭代器是不会变的(这和string类不同 所以上面我可以用 。end()来判断结尾) pr这时候指向的是(max)中的‘)’的后一位,又因为我之后pr要++
                    pr--;//所以这时候让pr指向‘)’,那下一个元素就是max元素的下一个了
                }
            }
    
            for(pr=word.begin();pr!=word.end();pr++)
            {
                cout<<*pr;
            }
            cout<<endl;
    
       }
    
        return 0;
    }

      然后在ac之后我去看了下别人的代码,发现string类自带插入功能,但是它在插入的时候是长度和迭代器都会发生变化的,应该是类似vector<char>一样的存在,但是这个代码没用到迭代器,用的是数,所以还是在循环的时候用.size()比较好,因为长度在不断变化嘛~(当然这也提醒了我们下次必要乱用那个size())接下来附上代码:

      

    #include <iostream>
    #include<string>
    using namespace std;
    
    int main(void)
    {
        string input_str,insert_str="(max)";
        int lenght;
        char max_char;
        while(cin>>input_str)
        {
            lenght=input_str.size();
            max_char=input_str[0];
            //求出字符串中的最大字符
            for(int i=1; i<lenght; i++)
            {
                if(input_str[i]>max_char)
                {
                    max_char=input_str[i];
                }
            }
    
            /*注意:在这里j的范围必须写成j<input_str.size(),不能用lenght代替。
            因为下面插入字符串后,整个字符串长度一直在变化
            */
            for(int j=0; j<input_str.size(); j++)
            {
                if(input_str[j]==max_char)
                {
                    input_str.insert(j+1,insert_str);
                    //插入的(max)占据了5个位置,所以j在扫描时候直接跳过
                    j+=5;
                }
            }
    
            cout << input_str << endl;
        }
    
        return 0;
    }

      再之后附上是string类的一些应用,通过代码体现:

    #include <iostream> 
    #include <string> 
    using std::cout; 
    using std::endl; 
    using std::string; 
    int main(void){ 
        string str1="We can insert a string"; 
        string str2="a str into "; 
             //在字符串指定位置前面插入指定字符串 
        cout <<str1.insert(14,str2)<<endl; 
        //在字符串指定位置前面插入指定字符串的子串(从指定索引开始的指定个数的字符) 
        cout <<str1.insert(14,str2,2,9)<<endl; 
        //插入指定字符串的前n个字符 
        cout <<str1.insert(14,"test hello",5)<<endl; 
        //插入n个相同字符到字符串中 
        cout <<str1.insert(14,6,'*')<<endl; 
    
        //替换指定索引开始的指定长度的子串 
        cout <<str1.replace(3,3,"may")<<endl; 
        //用给定字符串的指定子串来进行替换 
        //如下,实际上使用的是could来进行替换 
               cout <<str1.replace(3,3,"can could",4,5)<<endl; 
        //使用给定字符串的前n个字符来进行替换:can 
        cout <<str1.replace(3,5,"can could",3)<<endl; 
        //使用指定个数的重复字符来进行替换 
        cout <<str1.replace(3,3,5,'*')<<endl; 
    
        string word="We"; 
        size_t index=str1.find(word); 
        if(index!=string::npos) 
        //删除指定索引开始的指定长度的字符 
        cout <<str1.erase(index,word.length())<<endl; 
        return 0; 
    
    }

    要详细看string类的解法请转向:http://blog.csdn.net/always2015/article/details/45508527

  • 相关阅读:
    JS中iframe子页面与父页面之间通信
    .NET 大数据量并发解决方案
    angular的性能分析 -随记
    第二次作业
    自我介绍
    总结作业
    2019春第四次课程设计实验报告
    2019春第三次课程设计实验报告
    2019春第二次课程设计实验报告
    第十二周作业
  • 原文地址:https://www.cnblogs.com/William-xh/p/6838170.html
Copyright © 2011-2022 走看看