暑假算法练习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;
}
原文地址:https://www.cnblogs.com/lvhang/p/15017325.html