首页 > 试题广场 >

换座位

[编程题]换座位
  • 热度指数:784 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
还记得上学时每周要换座位吗?第四组换到第一组、第一组换到第二组……
现在用一个字母表示一个组,请你计算经历n周之后座位的情况。

输入描述:
输入有多组数据,每组数据一行。

每行包括一个字符串s和整数n

1. s只有相互不同的字母构成。
2. 如果n是正整数,字符串向右移动;否则向左移动。


输出描述:
对应每一组输入,输出调整之后的座位情况。
示例1

输入

ABCD 2
ABCD -1

输出

CDAB
BCDA
//约瑟夫问题
#include<iostream>
(720)#include<string>
#include<algorithm>
using namespace std;
int main(){
    string s;
    long long  n;
    while(cin>>s>>n){
        string res=s;
        if(n>0){///右移n位,相当于左移s.size()-n位
            n%=s.size();
        	for(int i=0;i<s.size();i++){
                res[i]=s[(i+s.size()-n)%s.size()];
            }
        }else if(n<0){
            n=-n;
            for(int i=0;i<s.size();i++){
                res[i]=s[(i+n)%s.size()];
            }
        }
        cout<<res<<endl;
    }
    return 0;
}

发表于 2020-03-16 16:03:25 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        while(scanner.hasNext()){
            String str=scanner.next();
            int n=scanner.nextInt();
            n%=str.length();
            str+=str;
            if(n>0)
                n=str.length()/2-n;
            else
                n=Math.abs(n);
            System.out.println(str.substring(n,n+str.length()/2));
        }
    }
} 

发表于 2018-09-20 20:45:40 回复(0)

python solution

使用deque来做。

from collections import deque
import sys

for i in sys.stdin.readlines():
    string, num = i.strip().split()
    q = deque(string)
    q.rotate(int(num))
    print("".join(list(q)))
发表于 2017-11-16 18:07:47 回复(0)
把输入取余数并变成向右移(左移k等价右移n-k),再取子串拼合即可。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(int argc, char** argv)
{
 //freopen("in.txt", "r", stdin);
 string s;
 int k;
 while (cin >> s >> k)
 {
  int n = s.size();
  k = (n + k % n) % n;
  cout << s.substr(n - k) + s.substr(0, n - k) << endl;
 }
 return 0;
}

编辑于 2017-07-19 10:50:02 回复(3)
【问题已解决】这判定系统真的是醉了。。。愣是说我测试用例不过。。。控制台输出明明就是一样的
测试用例:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -2147483648
对应输出应该为:
YZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX
#include <iostream>
#include <string>
using namespace std;

int main()
{
	string str;
	long long n;
	while (cin >> str >> n)
	{
		n = n % str.length();
		if (n < 0) n += str.length();
		string temp = str.substr(str.length() - n, n) + str.substr(0, str.length() - n);
		//sub1 = string(str.begin() + str.length() -n, str.end());
		//sub2 = string(str.begin(), str.begin() + str.length() - n);
		cout << temp << endl;
	}
	return 0;
}
后来,终于意识到问题可能出在隐式类型转换上面,把str.length() 所得的结果(size_t类型)强制赋值给一个long long 临时变量就过了。他的系统没有在求模运算时将 size_t 自动隐式类型转化为long long,所以造成报错。但是在我的VS上,这些都是自动完成的。。。真是醉。。。
#include <iostream>
#include <string>
using namespace std;

int main()
{
	string str;
	long long n;
	while (cin >> str >> n)
	{
		long long len = str.length();
		n = n % len;
		if (n < 0) n += len;
		string temp = str.substr(len - n, n) + str.substr(0, len - n);
		//sub1 = string(str.begin() + str.length() -n, str.end());
		//sub2 = string(str.begin(), str.begin() + str.length() - n);
		cout << temp << endl;
	}
	return 0;
}

编辑于 2015-12-19 18:24:50 回复(0)
#include<cstdio>
(802)#include<cstring>
#include<algorithm>
using namespace std;
char str[100010];
void reverse(char str[],int l,int r){
    int k=0;
    for(int i=l;i<=(l+r)/2;++i){
         swap(str[i],str[r-k]);
         k++;
    }
    //printf("%s\n",str);
}
int main(){
    int n;
    while(scanf("%s",str)!=EOF){
        scanf("%d",&n);
        int len=strlen(str);
        if(len==1){
            printf("%s\n",str);
            continue;
        }
        if(n<0){
            if(n%len==0)
                n=0;
            else
                n=n%len+len;
        }else{
            n=n%len;
        }
        reverse(str,0,len-n-1);
        reverse(str,len-n,len-1);
        reverse(str,0,len-1);
        printf("%s\n",str);
    }
    return 0;
}

发表于 2020-03-30 22:45:34 回复(0)

python的-1%4 = 3,左移一次相当于右移三次

while True:
    try:
        str,n = input().split()
        n = int(n)%len(str)
        print(str[len(str)-n:]+str[:len(str)-n])
    except:break
发表于 2019-07-15 09:40:32 回复(0)
#include <iostream>
#include <string>
using namespace std;
int main()
{
    int n;
    string s;
    while(cin>>s>>n)
    {
        string tmp=s+s;
        int length=s.size();
        int k=n%length;
        if(k<0)
            k=abs(k);
        else if(k>0)
            k=length-k;
        string res=tmp.substr(k,length);
        cout<<res<<endl;
    }
    return 0;
}

发表于 2017-10-08 17:29:52 回复(0)
输入的数值带有符号,必须用long long存储;
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str;
	int cnt;
	long long num;
	while (cin >> str >> num)
	{
		if (num > 0)
		{
			cnt = num % str.length();
			for (int i = str.length() - cnt; i < str.length(); i++)
				cout << str[i];
			for (int i = 0; i < str.length() - cnt; i++)
				cout << str[i];
			cout << endl;
		}
		else if (num < 0)
		{
			cnt = (-num) % str.length();
			for (int i = cnt; i < str.length(); i++)
				cout << str[i];
			for (int i = 0; i < cnt; i++)
				cout << str[i];
			cout << endl;
		}
		else
			cout << str << endl;
	}
	return 0;
}

发表于 2017-04-24 13:13:29 回复(0)
from collections import deque
try:
    while 1:
        a = raw_input().split()
        s, n = deque(a[0]), int(a[1])
        s.rotate(n)
        print ''.join(s)
except:
    pass

发表于 2016-12-29 19:33:48 回复(0)
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String s = sc.next();
			int n = sc.nextInt() % s.length();
			if(n == 0) System.out.println(s);
			else if(n > 0) System.out.println(s.substring(s.length() - n) + s.substring(0, s.length() - n));
			else System.out.println(s.substring( - n) + s.substring(0, - n));
		}
	}
}

发表于 2016-10-12 01:04:46 回复(0)
思路:移位的次数如果是小组个数的整数倍,即n是字符串长度的整数倍时,那么字符串原顺序不变。因此,处理时只处理n % (s.length())次移动。
处理如下:
首先判断n的值:
1、n == 0 或者 n % s.length() == 0 或者 s.length() == 0时,直接返回,输出源字符串即可;
2、除了1的情况,只有n > 0和n < 0两种情况,分别处理如下:
    1)n > 0时,例如ABCD,n = 2,此时第一次移动可以看做A的前面插入一个D,然后删掉字符串尾的D,变为DABC;第2次移动看做D的前面插入一个C,然后将字符串尾的C删除,变为CDAB。因此最后结果为CDAB-->总结来看,移动n次,即相当于移动n = n % s.length()次,也就是将字符串的后n个字符依次插入到字符串的首位置,再删除后n个字符。
    2)n < 0时,例如ABCD,n = -2,此时第一次移动可以看做D的后面插入一个A,然后删掉字符串头的A,变为BCDA;第二次移动看做A的后面插入一个B,然后删除字符串头的B,变为CDAB,因此最后结果为CDAB-->总结开看,移动n次,即相当于移动n = n % s.length()次,也就是将字符串的前n个字符一次插入到字符串的尾位置之后,再删除前n个字符。
代码如下所示:
// write your code here cpp
#include <iostream>
#include <string>
using namespace std;
void change(string& s, int n)
    {
    int len = s.length();
    if(len == 0 || n == 0 || abs(n) % len == 0)
        return;
    int x = n % len;
    if(n < 0)
        {
        while(x ++)
            {
            s.insert(s.length(), 1, s[0]);
            s.erase(s.begin() - 1);
        }
    }
    else
        {
        while(x --)
            {
            s.insert(0, 1, s[s.length()- 1]);
            s.erase(s.end() - 1);
        }
    }
}
int main()
    {
    string s;
    int n;
    while(cin >> s >> n)
        {
        change(s, n);
        cout << s << endl;
    }
}
发表于 2015-08-19 18:46:17 回复(0)