首页 > 试题广场 >

小明的字符串

[编程题]小明的字符串
  • 热度指数:3117 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
小明同学需要对一个长度为 N 的字符串进行处理,他需要按照要求执行若干步骤,每个步骤都均为下面 2 种操作中的一种,2 种操作如下:
TYPE 1. 从字符串结尾开始算起,将第 X 个字符之前的字符移动到字符串末尾
TYPE 2. 输出字符串索引为 X 的字符
小明尝试了很久没能完成,你可以帮他解决这个问题吗?

输入描述:
第一行,包含两个整数,字符串的长度 N 和操作次数T;
第二行为要操作的原始字符串;

之后每行都是要执行的操作类型 TYPE 和操作中 X 的值,均为整数。

输入范围:
字符串长度 N:1 <= N <= 10000
操作次数 T:1 <= T <= 10000
操作类型 TYPE:1 <= TYPE<= 2
变量 X:0 <= X < N


输出描述:
操作的执行结果
示例1

输入

6 2
xiaomi
1 2
2 0

输出

m
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int N,T,t,x;
    cin>>N>>T;
    string s,str="";
    cin>>s;
    for(int i=0;i<T;i++)
    {
        cin>>t>>x;
        if(t==1)
            s=s.substr(s.size()-x)+s.substr(0,s.size()-x);
        if(t==2)
            cout<<s[x]<<endl;
    }
    return 0;
}

发表于 2019-07-05 20:19:41 回复(1)
看了一眼评论,怎么都在做啊。。。
算个偏移量就可以了,不要拼接字符串呀
N,T = [int(x) for x in input().split()]
s = input()
cur = 0
for i in range(T):
    TYPE,X = [int(x) for x in input().split()]
    if TYPE==1:
        cur+=N-X
        cur%=N
    if TYPE==2:
        print(s[(cur+X)%N])


发表于 2019-11-29 22:32:33 回复(0)
当使用1000个测试用例的时候,其中有483个2类型操作,
然后输出结果,题目所给的应得结果只有124个,我输出了483个
我输出的前124个跟题目所给的应得结果是一样的
代码粘贴如下,如有大佬解答,万分感谢
#include <stdio.h>

int main() {
	int length;
	int op;
	scanf("%d %d", &length, &op);
	char str_in[10000] = { 0 };
	char str_temp[10000] = { 0 };
	char print_str[10000] = { 0 };
	gets(str_in);
	int i = 0;
	int j = 0;
	int go_op[1100][2] = { 0 };
	for (i = 0; i < length; i++) {
		scanf("%c", &str_in[i]);
	}
	for (i = 0; i < length; i++) {
		str_temp[i] = str_in[i];
	}
	int result_count = 0;
	for (i = 0; i < op; i++) {
		scanf("%d %d", &go_op[i][0], &go_op[i][1]);		
		if (go_op[i][0] == 1) {
			for (j = 0; j < length - go_op[i][1]; j++) {
				str_in[length + j] = str_in[j];
			}
			for (j = 0; j < length; j++) {
				str_temp[j] = str_in[j + length - go_op[i][1]];
			}
			for (j = 0; j < length; j++) {
				str_in[j] = str_temp[j];
			}
		}
		else if (go_op[i][0] == 2) {
			
		//	printf("%c", str_temp[go_op[i][1]]);
			print_str[result_count] = str_temp[go_op[i][1]];
			result_count++;

		
		}
	}		
//	printf("%c\n", str_in[87]);
	for (i = 0; i < result_count; i++) {
		 printf("%c ", print_str[i]);
	}
	
}

编辑于 2019-08-17 10:57:54 回复(2)
1.直接通过字符串拼接来进行模拟
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().trim().split(" ");
        int N = Integer.parseInt(params[0]);
        int T = Integer.parseInt(params[1]);
        String str = br.readLine().trim();
        int n = str.length();
        while(T-- > 0){
            String[] typeX = br.readLine().trim().split(" ");
            int type = Integer.parseInt(typeX[0]);
            int X = Integer.parseInt(typeX[1]);
            if(type == 1)
                str = str.substring(n - X) + str.substring(0, n - X);
            else
                System.out.println(str.charAt(X));
        }
    }
}


2.将字符串(长度为n)视作一个环形队列,刚开始头部front=0,每进行一次type=1的操作,头部就往右移动至front+X的位置,考虑到环形的情况,新的队头应该为(front+X)%n
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().trim().split(" ");
        int N = Integer.parseInt(params[0]);
        int T = Integer.parseInt(params[1]);
        String str = br.readLine().trim();
        int n = str.length();
        // 将字符串视作一个环形队列
        int front = 0;
        while(T-- > 0){
            String[] typeX = br.readLine().trim().split(" ");
            int type = Integer.parseInt(typeX[0]);
            int X = Integer.parseInt(typeX[1]);
            if(type == 1){
                front += (n - X) % n;
            }else{
                System.out.println(str.charAt((front + X) % n));
            }
        }
    }
}


编辑于 2021-02-24 12:13:43 回复(0)
while True:
    N,T=map(int,input().split())
    char=input()
    for i in range(T):
        type,X=map(int,input().split())
        if type == 1:
            char = char[-X:] + char[:-X]
        else:
            print(char[X])
    break

结合大佬们的代码优化了一下
发表于 2020-07-28 18:06:26 回复(0)

因为python支持负索引,所以python处理这种字符串很简单:

while True: 
    try:
        n,t = map(int, input().split())
        s = input()
        for _ in range(t):
            typeop, x = map(int, input().split())
            if typeop == 1:
                s = s[-x:] + s[:-x]
            else:
                print(s[x])
    except:
        break
编辑于 2020-07-13 17:23:17 回复(1)
#include <iostream>
#include <string>
using namespace std;
int main()
{
    int n,T;
    cin >> n >> T;
    string str;
    cin >> str;
    while(T--)
    {
        int x,type;
        cin >> type >> x;
        if(type == 2)
            cout << str[x] << endl;
        if(type == 1)
        {
            string str1 = str.substr(0,n-x);
            string str2 = str.substr(n-x);
            str = str2+str1;
        }
    }
    return 0;
}

发表于 2019-10-02 16:15:28 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int N, T;
    string s, s1, s2;
    cin>>N>>T;
    cin>>s;
    int a, b;
    while(T--){
        cin>>a>>b;
        if(a==1){
            s1 = s.substr(0, N-b);
            s2 = s.substr(N-b, b);
            s = s2 + s1;
        }else if(a==2)
            cout<<s[b]<<endl;
    }
    return 0;
}

发表于 2019-07-29 23:09:46 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] s = br.readLine().split(" ");
        int n = Integer.parseInt(s[0]);
        int t = Integer.parseInt(s[1]);
        String str = br.readLine();
        for (int i = 0; i < t; i++) {
            String[] s1 = br.readLine().split(" ");
            int type = Integer.parseInt(s1[0]);
            int x = Integer.parseInt(s1[1]);
            if (type == 1) {
                str = str.substring(n - x) + str.substring(0, n - x);
            } else {
                System.out.println(str.charAt(x));
            }
        }
    }
}
发表于 2019-07-15 17:01:24 回复(0)
测试用例是不是有问题啊
发表于 2019-07-06 20:00:56 回复(0)
package main

import (
    "fmt"
    "os"
    "bufio"
)

var in=bufio.NewReader(os.Stdin)

func main() {
    var n,t int
    fmt.Fscan(in,&n,&t)
    var s string
    fmt.Fscan(in,&s)
    var a,b int
    for t>0{
        fmt.Fscan(in,&a,&b)
        if a==1{
            s=s[len(s)-b:]+s[:len(s)-b]
        }else{
            fmt.Println(string(s[b]))
        }
        t--
    }
}

发表于 2023-03-23 10:47:33 回复(0)
 public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int t=sc.nextInt();
        String str=sc.next();
        for(int i=0;i<t;i++){
            int type=sc.nextInt();
            int x=sc.nextInt();
            if(type==1){
                str=str.substring(n-x)+str.substring(0,n-x);
            }else{
                System.out.println(str.charAt(x));
            }
        }
        sc.close();
    }

发表于 2021-01-07 13:05:20 回复(0)
#include<iostream>
#include<string>
int main()
{
    int N,T,TYPE,X;
    std::string s;
    while(std::cin>>N>>T)
    {
        std::cin>>s;
        for(int i=0;i<T;i++)
        {
            std::cin>>TYPE>>X;
            if(TYPE==1)
            {
                s+=s.substr(0,N-X);
                s.erase(0,N-X);
            }
            else std::cout<<s[X]<<std::endl;
            
        }
    }
    return 0;
}
发表于 2020-09-09 08:43:20 回复(0)
import sys
in_num = sys.stdin.readline().strip().split()
N,T = int(in_num[0]),int(in_num[1])
ori_str = sys.stdin.readline().strip()
res = ori_str
for i in range(T):
    pro = sys.stdin.readline().strip().split()
    sub_pro = int(pro[0])
    move_bin = int(pro[1])
    if sub_pro == 1:
        res = res[N-move_bin:] + res[0:N-move_bin]
    elif sub_pro == 2:
        print(res[move_bin])

发表于 2020-07-09 18:39:23 回复(0)
#include<iostream>
(720)#include<string>

using namespace std;

int main(void){
    int m, n;
    cin>>m>>n;
    string str;
    cin>>str;
    int op, X;
    string temp1, temp2;
    for (int i = 0; i < n; i++){
        cin>>op>>X;
        if (op == 1){
            temp1 = str.substr(0, m-X);
            temp2 = str.substr(m-X);
            str = temp2 + temp1;
        }
        else{
            cout<<str[X]<<endl;
        }
    }
    return 0;
}

发表于 2020-05-09 21:43:40 回复(0)
n,t = list(map(int,input().split()))
s = input()
for i in range(t):
    types,x = list(map(int,input().split()))
    if types==1:
        s = s[-x:]+s[:-x]
    else:
        print(s[x])

发表于 2020-05-03 12:38:58 回复(0)
#include<bits/stdc++.h>

using namespace std;

int main(void)
{
	int z, x;
	cin >> z >> x;
	string s;
	cin >> s;
	vector<int> v1, v2;
	char c;
	while (x--)
	{
		int c, v;
		cin >> c >> v;
		v1.push_back(c);
		v2.push_back(v);
	}
	for (int i = 0; i < v1.size(); i++)
	{
		if (v1[i] == 1)
		{
			string s1, s2;
			for (int j = 0; j < z - v2[i]; j++)s1 += s[j];
			for (int j = z - v2[i]; j < z; j++)s2 += s[j];
			s = "";
			s += s2;
			s += s1;
		}
		else cout << s[v2[i]] << endl;
	}
}

发表于 2020-03-31 22:19:05 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int N,T;   //字符串长度N,操作次数T
    cin >> N >> T;
    cin.ignore();   //cin后用getline前一定要ignore吃回车
    string str;
    getline(cin,str);
    while(T--)
    {
        int type,x;
        cin >> type >> x;   
        if(type == 1) //type=1将字符串的倒数第x字符前的字符全移动到字符串末尾
        {
            string t = str.substr(0,str.length()-x);
            //cout << t << endl;
            str = str.substr(str.length()-x,x) + t;
            //cout << str << endl;
        }
        else  //type=2将字符串的第x个字符进行输出
        {
            cout << str[x] << endl;
        }
    }
    return 0;
}

发表于 2019-10-04 14:20:05 回复(0)
看了大佬们的代码,感觉自己写的好low
import sys
lines=sys.stdin.readlines()
lines=[l.strip().split() for l in lines if l.strip()]
N,T=int(lines[0][0]),int(lines[0][1])
S=lines[1][0]
lines=lines[2:]
for i in range(T):
    a=int(lines[i][0])
    b=int(lines[i][1])
    if a==1:
        S=S[-1*(b):]+S[:N-b]
    elif a==2:
        print(S[b])
发表于 2019-09-14 16:34:18 回复(0)
def f(n,list):
    for i in list:
        if i[0]=="1":
            a= i[0]
            b=int(i[1])
            n=n[-b:]+n[:-b]
        if i[0]=="2":
            c=int(i[1])
            print( n[c])


if __name__=="__main__":
    m=list(map(int,input().strip().split(" ")))
    n=input()
    list=[]
    for _ in range(m[1]):
        list.append(input().strip().split(" "))
    f(n,list)

发表于 2019-09-12 15:57:40 回复(0)