• 暑假算法练习Day4


    已经坚持第四天啦,Fighting!!!

    1008 数组元素循环右移问题 (20 分)

    一个数组(A)中存有(N)((>0))个整数,在不允许使用另外数组的前提下,将每个整数循环向右移(M)(≥0)个位置,即将(A)中的数据由((A_0A_1⋯A_{N−1}))变换为((A_{N−M}⋯A_{N−1}A_0A_1⋯A_{N−M−1}))(最后(M)个数循环移至最前面的(M)个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

    输入格式:

    每个输入包含一个测试用例,第1行输入(N(1≤N≤100))(M(≥0));第2行输入(N)个整数,之间用空格分隔。

    输出格式:

    在一行中输出循环右移(M)位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

    输入样例:

    6 2
    1 2 3 4 5 6
    

    输出样例:

    5 6 1 2 3 4
    

    解题分析及代码:

    这一题一开始我采用的是使用另外一个数组存变化后的数组,然后再输出。但是我们注意到题目有说“不允许使用另外数组”,因此这个方法显然行不通,我们需要采用另外一个方法,就是直接去找变化后的第一个元素,然后依次输出,因此本题就转化为了,找出变化后的第一个元素的下标然后按顺序输出,特别地,我们要注意(m)需要先进行模(n)运算,这样才能保证“移动数据的次数尽量少”,且(n-m)结果大于(0)

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    int main() {
        int n,m;
        int A[105]={0};
        cin >> n >> m;
        for(int i=0;i<n;i++)
            cin >> A[i];
        m%=n;
        for(int i=n-m;i<n;i++){
            cout << A[i] <<' ';
        }
        for(int i=0;i<n-m;i++){
            cout << A[i];
            if(i!=n-m-1)cout <<' ';
            else cout<<endl;
        }
        return 0;
    }
    

    1009 说反话 (20 分)

    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

    输入格式:

    测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

    输出格式:

    每个测试用例的输出占一行,输出倒序后的句子。

    输入样例:

    Hello World Here I Come
    

    输出样例:

    Come I Here World Hello
    

    解题分析及代码:

    题目要求很简单,其实就是从后往前输出单词,这时我们需要注意,cin对字符串的输入是遇到空格回车键就结束输入,因此我们需采用while(cin>>str)判断输出是否结束,这样当检测到文本结束(平台给出的测试中会有ctrl+Z)时,while就会结束循环。当然如果有多条语句输入时,显然这个不太适合。此时就可以考虑使用cin.get()、 getchar()来进行判断解决。

    此外,本题还利用到了栈,这是一个比较巧妙的思路。利用栈先进后出的性质,正好可以解决本题的要求。

    这里也归纳一下栈的常见用法。

    栈(stack)说明及举例:
    使用栈,要先包含头文件 : #include<stack>
    定义栈,以如下形式实现: stack<Type> s; 其中Type为数据类型(如 int,float,char等)。
    栈的主要操作:

    s.push(item);		//将item压入栈顶
    s.pop();			//删除栈顶的元素,但不会返回
    s.top();			//返回栈顶的元素,但不会删除
    s.size();			//返回栈中元素的个数
    s.empty();			//检查栈是否为空,如果为空返回true,否则返回false
    
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    #include <stack>
    using namespace std;
    int main() {
        string str;
        stack<string>str2;
        while(cin >> str)
            str2.push(str);
        while(!str2.empty()){
            cout << str2.top();
            str2.pop();
            if(!str2.empty()) cout <<' ';
            else cout <<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    用GitHub Pages搭建博客(三)
    Beta阶段项目总结
    最终团队绩效评估
    Alpha阶段项目总结
    项目发布
    Alpha版总结会议
    第二次冲刺周期站立会议(10)
    第二次冲刺周期站立会议(9)
    第二次冲刺周期站立会议(8)
    第二次冲刺周期站立会议(7)
  • 原文地址:https://www.cnblogs.com/lvhang/p/15017325.html
Copyright © 2020-2023  润新知