• 每日一练2——C++排序子序列问&&倒置字符串问题



    排序子序列问题

    题目链接
    这道题题意不难理解,但是想写对还是有很多细节的。
    本题要求解的是排序子序列,排序子序列为非递增或者非递减,非递减就是a[i]<=a[i+1],递减就是a[i]>a[i+1],非递增就是a[i]>=a[i+1],递增就是a[i]

    思路:

    1. 本题依次比较整个数组
    2. a[i+1]>a[i] ,则进入非递减序列判断,直到遍历到下一个值不大于等于为止count++,然后进行下一位置的判断。
    3. a[i+1]
    4. a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减序列。

    本题注意点:本题开始比较a[i+1]与a[i]进行比较,为了避免越界,数组定义为n+1个,同时给a[n] = 0;a[n] = 0带来的影响,我们分为三种情况讨论:

    1. 若到a[n-1] 的最后一组是非递减序列,当i==n-1,a[i] >a[i+1],因为前面的数都是大于0的,这个输入条件已经说明了(去看看题目输入条件描述),里面的循环结束,i++,count++,i ==n,外面的循环结束。
    2. 若到a[n-1] 的最后一组是非递增序列,当i== n-1,a[i] >a[i+1],因为前面的数都是大于0的,这个输入条件已经说明了(去看看题目输入条件描述),循环再走一次,i++, i== n,里面的循环结束,i++,count++,i==n+1,外面的循环结束。
    3. 第三种情况 1 2 1 2 1最后一个数是单独的情况,后面补个0,序列变成1 2 1 2 1 0,当走完全面的序列i== n-1时,a[i] > a[i+1],这样会判断出一个非递增序列,count++,i++, i== n 外面的循环结束。

    也就是说数组最后一个位置多增加一个0,不会影响第1、2情况的判断,主要是帮助第3情况的正确判断。

    代码:

    #include
    #include
    
    using namespace std;
    int main() {
    	int num = 0;
    	cin >> num;
    	vector<int> v;
    	v.resize(num + 1);
    	v[num] = 0;
    
    	for (int i = 0; i < num; i++)
    	{
    		cin >> v[i];
    	}
    
    
    	int count = 0;
    	int j = 0;
    
    	while (j<num)
    	{
    		if (v[j] < v[j + 1])
    		{
    			while (j<num&&v[j]<=v[j+1])
    			{
    				j++;
    			}
    			count++;
    			j++;
    		}
    		else if(v[j]==v[j+1])
    		{
    			j++;
    		}
    		else
    		{
    			while (j < num && v[j] >= v[j + 1])
    			{
    				j++;
    			}
    			count++;
    			j++;
    		}
    	}
    	
    	cout << count << endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    倒置字符串

    题目链接

    思路:

    方法一:

    先创建一个两个string类分别命名为str和temp,用getline把一行输入到str中,然后倒着遍历str,遇到空格就将空格之后的字符串整体尾插到temp中,然后再把刚才空格之后的字符串从str中删去,直到遍历到str的下标为0位置处停止。
    但是这样会少了开头的一串字符串
    例如:I like beijing.
    在这里插入图片描述

    倒着遍历的话I前面可没有空格,而且已经倒履str下标为0的位置处了,退出while循环,所以下面还要把第一个空格之前的字符串补回来即可。

    代码:

    #include
    #include 
    using namespace std;
    int main() 
    {
        string str;
    //std::getline(cin,str);
        std::getline(std::cin, str);
        string temp;
        for (int i = str.size() - 1; i >= 0; i--) 
        {
            if (str[i] == ' ') 
            {
                temp.append(str, i + 1);
                temp += ' ';
                str.erase(i);
            }
        }
        
        temp.append(str);//把第一个空格之前的字符串补回来
        
        cout << temp;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    方法二:

    第二思路是一个比较取巧的思路,直接利用cin>>s接收输入,遇到空格就结束了,自然就分割开了每个单词,其次将每次接收到的单词拼接到之前串的前面就逆置过来了。

    代码:

    #include 
    #include 
    using namespace std;
    // cin读取string时自动会被空格分隔开,用另一个字符串存储进行逆序输出
    int main()
    {
    	string s1, s2;
    	cin >> s2;
    	while (cin >> s1)
    		s2 = s1 + " " + s2;
    	cout << s2 << endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    end

  • 相关阅读:
    智能导览与实时监测:数字孪生助力景区管理
    【Educoder作业】问题求解——网页数据获取
    SDN系统方法 | 8. 网络虚拟化
    翻译: Transformer一种用于语言理解的新型神经网络架构 Google AI
    LLM 中的参数单位
    优化冗余的if-else,“责任树模式”是个不错的选择
    【配置环境】VS Code怎么使用JavaScript的Mocha测试框架和Chai断言库
    与C语言不同的基础语法
    使用vue router的步骤是什么,并举个例子?
    迅为RK3588开发板编译环境Ubuntu20.04 编译配置增加交换内存
  • 原文地址:https://blog.csdn.net/qq_55712347/article/details/128026532