首页 > 试题广场 >

查找

[编程题]查找
  • 热度指数:14987 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
    读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共有2中命令:1、翻转  从下标为i的字符开始到i+len-1之间的字符串倒序;2、替换  命中如果第一位为1,用命令的第四位开始到最后的字符串替换原读入的字符串下标 i 到 i+len-1的字符串。每次执行一条命令后新的字符串代替旧的字符串(即下一条命令在作用在得到的新字符串上)。     命令格式:第一位0代表翻转,1代表替换;第二位代表待操作的字符串的起始下标int i;第三位表示需要操作的字符串长度int len。

输入描述:
输入有多组数据。
每组输入一个字符串(不大于100)然后输入n,再输入n条指令(指令一定有效)。


输出描述:
根据指令对字符串操作后输出结果。
示例1

输入

bac
2
003
112as

输出

cab
cas
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
    string str;
    int n;
    while(cin>>str>>n)
    {
        string command;
        for(int i=0;i<n;i++)
        {
            cin>>command;
            int flag  =command[0]-48;
            int start =command[1]-48;
            int len   =command[2]-48;
            command.erase(0,3);
            if(flag==0)
            {
                reverse(str.begin()+start,str.begin()+start+len);

            }
            else if(flag==1)
            {
                str.insert(start,command);
                str.erase(start+command.size(),len);

            }
            cout<<str<<endl;
        }

    }

}

发表于 2018-03-25 19:56:39 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main()
{
    string s,t;
    int i,j,k,n,f,len;
    while(cin>>s>>n)
    {
        for(j=0;j<n;j++)
        {
            cin>>t;
            f=t[0]-'0';
            i=t[1]-'0';
            len=t[2]-'0';
            if(f==0)
                reverse(s.begin()+i,s.begin()+i+len);
            else
                s.replace(i,len,t.substr(3));
            cout<<s<<endl;
        }
    }
}

发表于 2018-05-09 09:56:21 回复(0)
//不用string的replace函数来做 感觉很呆
#include <bits/stdc++.h>

using namespace std;

int main()
{
    string str;
    int n = -1;//n条指令
    string cmd;
    int strSize = -1;
    int cmdSize = -1;

    while(cin >> str)
    {
        strSize = str.size();
        cin >> n;
        while(n--)
        {
            cin >> cmd;
            cmdSize = cmd.size();
            if(cmdSize == 3 && cmd[0] == '0')
            {
                int i = cmd[1] - '0';//start
                int j = (cmd[1] - '0') + (cmd[2] - '0') - 1;
                char temp;
                while( i < j)
                {
                    temp = str[j];
                    str[j] = str[i];
                    str[i] = temp;
                    i++;
                    j--;
                }
            }
            else if(cmd[0] == '1')
            {
         
                string str1(str,0,(cmd[1]-'0'));
                string str2(str,(cmd[1]-'0') + (cmd[2]-'0'),strSize - (cmd[1] - '0') - (cmd[2] - '0'));
                string str3(cmd,3,cmdSize - 3);
                str = str1 + str3 + str2;
                strSize = str.size();
            }
            cout << str << endl;
        }
    }
    return 0;
}

发表于 2021-03-02 16:51:53 回复(0)
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
//字符0和数字0不能相提并论,这点卡了我好一会儿,多注意这些细节T_T
int main(void)
{
    string s;
    vector<string> t;

    while (cin >> s)
    {
        t.clear();

        int n;
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            string temp;
            cin >> temp;
            t.push_back(temp);
        }

        for (vector<string>::iterator it = t.begin(); it != t.end(); it++)
        {
            string a;//一条指令
            a = *it;

            if (a[0] == '0')//翻转
            {
                char i = a[1] - 48;//字符‘0’与数字0之间相差了48
                char len = a[2] - 48;
                reverse(s.begin() + i, s.begin() + i + len);//倒转时不包括结束元素(第二个实参)
                cout << s << endl;
            }
            if (a[0] == '1')//替换
            {
                char i = a[1] - 48;
                char len = a[2] - 48;
                char b = 3;
                if(i < s.length())
                {
                    string str_1;
                    
                    for(int k = b;k < a.size();k++)
                        str_1.push_back(a[k]);
                    
                    s.replace(i,len,str_1);//用str_1替换从i开始的n个字符的子串(从0开始)
                    cout << s << endl;
                }
            }
        }
    }
    return 0;
}

发表于 2021-02-18 16:48:52 回复(0)
#include<bits/stdc++.h>

using namespace std;

void Option(string& s, string o)
{
    int op = o[0]-'0', start = o[1]-'0', len = o[2]-'0';
    if(op == 0)
        reverse(s.begin()+start, s.begin()+start+len);
    else if(op == 1)
        s.replace(start, len, o.substr(3));
    cout << s << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    string s, o; int n;
    while(cin >> s >> n)
    {
        while(n--)
        {
            cin >> o; Option(s, o);
        }
    }
    return 0;
}

发表于 2021-01-20 12:10:04 回复(0)
/*描述
    读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共有2中命令:
    1、翻转  从下标为i的字符开始到i+len-1之间的字符串倒序;2、替换  命中如果第一位为1,
    用命令的第四位开始到最后的字符串替换原读入的字符串下标 i 到 i+len-1的字符串。
    每次执行一条命令后新的字符串代替旧的字符串(即下一条命令在作用在得到的新字符串上)。
    命令格式:第一位0代表翻转,1代表替换;第二位代表待操作的字符串的起始下标int i;
    第三位表示需要操作的字符串长度int len。*/
#include<stdio.h>
(737)#include<string.h>
int main()
{
    char a[200],b[100];
    int n,m,i,len,j,k,c,len2;//两种方式
    scanf("%s",a);
    scanf("%d",&n);
    for(j=0;j<n;j++)//n等于几处理几次
    {
        //输入一个三位数
        scanf("%d",&c);
        len=c%10;//个位代表需要操作的字符串长度
        i=c/10%10;//十位代表字符串要操作的起始下标
        m=c/100;//百位  0代表逆序翻转,1代表替换
        if(m)//替换
        {
            scanf("%s",b);//新增字符
            strcpy(b+strlen(b),a+i+len);//把a需要操作的那一段之后不需操作的代码放在b数组的后面
            strcpy(a+i,b);//从要操作的地方开始后面的全部用b替换
        }
        else{//倒序i+k--i+len-1-k    范围为len的一半
            len2=len/2;
            for(k=0;k<len2;k++)
            {
                char temp;
                temp=a[k+i];
                a[k+i]=a[len+i-1-k];
                a[len+i-1-k]=temp;
            }
        }
        puts(a);
    }

    return 0;
}

发表于 2020-05-06 16:01:38 回复(0)
#include <bits/stdc++.h>

using namespace std;

int main() {
    string str;
    while (cin >> str) {
        int n;
        cin >> n;
        string command;
        while(n != 0) {
            cin >> command;
            if (command[0] == '0') {
                for (int i = 0; i < (command[2] - '0') / 2; ++i) {
                    char ch = str[i + command[1] - '0'];
                    str[i + command[1] - '0'] = str[command[1] - '0' + command[2] - '0' - 1 - i];
                    str[command[1] - '0' + command[2] -'0' - 1 - i] = ch;
                }
            } else {
                str = str.substr(0, command[1] - '0') + command.substr(3) +
                      str.substr(command[1] + command[2] - 2 * '0');
            }
            cout << str << endl;
            n--;
        }
    }
    return 0;
}

发表于 2020-03-22 12:44:30 回复(0)
Java  按照题目说着做
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            String s = scanner.next();
            int n = scanner.nextInt();
            for (int i = 0; i < n; i++) {
                String instruction = scanner.next();
                char[] array = instruction.toCharArray();
                int start =array[1] - '0';
                int len = array[2] - '0';
                if (array[0]=='1'){
                    String replace = instruction.substring(3);
                    String ss=s.substring(0,start)+replace+s.substring(start+len);
                    s=ss;
                    System.out.println(ss);

                }else {
                    String replace = new StringBuilder(s.substring(start,start+len)).reverse().toString();
                    String ss=s.substring(0,start)+replace+s.substring(start+len);
                    s=ss;
                    System.out.println(ss);
                }
            }
        }



    }
}


发表于 2020-03-19 19:28:37 回复(0)
import java.util.Scanner;

public class Test{
    public static void main(String[] args)  {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String str = scanner.next();
            int n = scanner.nextInt();
            for(int i = 0; i < n; i++) {
                String com = scanner.next();
                if(com.charAt(0) == '0') {
                    str = retravel(str, com, (int)(com.charAt(1) - '0'), (int)(com.charAt(2) - '0'));
                }else if(com.charAt(0) == '1') {
                    str = replace(str, com, (int)(com.charAt(1) - '0'), (int)(com.charAt(2) - '0'));
                }
            }
        }
    }

    private static String replace(String str, String com, int i, int j) {
        String newStr1 = str.substring(0, i);
        String newStr2 = com.substring(3, com.length());
        String newStr3 = "";
        if((i + j) <= str.length() - 1) newStr3 = str.substring((i + j), str.length() );
        str = newStr1 + newStr2 + newStr3;
        System.out.println(str);
        return str;
    }

    private static String retravel(String str, String com, int i, int j) {
        StringBuffer newStr = new StringBuffer();
        if(i > 0) newStr.append(str.substring(0, i));
        for(int k = (i + j - 1); k >= i; k--) {
            newStr.append(str.charAt(k));
        }
        if((i + j) < str.length()) newStr.append(str.substring((i + j), str.length()));
        str = String.valueOf(newStr);
        System.out.println(str);
        return str;
    }
}
发表于 2020-03-07 12:19:09 回复(0)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    string tmp;
    cin>>tmp;
    int n;
    cin>>n;
    while(n--)
    {
        int num[3];
        string strb;
        cin>>strb;
        if(strb[0]=='1')
        {
            int x = strb[1]-'0';
            int lent = strb[2]-'0';
            tmp = tmp.substr(0,x)+strb.substr(3,strb.size()-3)+tmp.substr(x+lent,tmp.size()-x-lent);
        }
        else 
        {
            string tmpb;
            for(int i=strb[1]-'0';i<strb[1]-'0'+strb[2]-'0';i++)
            {
                tmpb = tmp[i]+tmpb;
            }
            int x = strb[1]-'0';
            int lent = strb[2]-'0';
            tmp = tmp.substr(0,strb[1]-'0') + tmpb + tmp.substr(x+lent,tmp.size()-x-lent);
        }
        cout<<tmp<<endl;
    }
    return 0;
}
发表于 2019-05-11 22:16:46 回复(0)
//事实证明STL库真是个好东西~
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
    string str;
    cin>>str;
    int n;
    cin>>n;
    string st;
    for(int j=0;j<n;j++){
        cin>>st;//开始我一直企图用gets然后一直输不进去…现在我也不知道为什么,烦请大神不吝赐教
        int i=st[1]-48;//字符串和数字的转化,超好用
        int len=st[2]-48;
        if(st[0]-48==0){
            reverse(str.begin()+i,str.begin()+i+len);
            cout<<str<<endl;
        }
        else{
            st.erase(st.begin(),st.begin()+3);
            cout<<str.replace(str.begin()+i,str.begin()+i+len,st)<<endl;
        }
    }
    return 0;
}


发表于 2019-01-24 10:53:41 回复(0)
就按照题说的做就行了。。
import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        String s = scan.next();
        int n = scan.nextInt();
        for(int i = 0; i < n; i++)
        {
            String command = scan.next();
            int second = command.charAt(1) - 48;
            int third = command.charAt(2) - 48;
            if(command.startsWith("0"))
            {
                s = s.substring(0, second)
                        + new StringBuilder(s.substring(second, second + third)).reverse().toString()
                        + s.substring(second + third);
            }
            else
            {
                s = s.substring(0, second)
                        + command.substring(3)
                        + s.substring(second + third);
            }
            
            System.out.println(s);
        }
        
        scan.close();
    }
}

发表于 2018-07-26 20:57:47 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s1;
    string s2;
    string s3;
    while(cin>>s1)
    {
        int n;
        cin>>n;
        for(int i = 1;i <= n;i++)
        {
            cin>>s2;
            s3 = s2;
            s3.erase(0,3);
            char a = s2[0];
            int s = s2[1] - '0';
            int e = s2[2] - '0';
            if(a == '0')
            {
                for(int i = s,j = s + e - 1;i < s + e / 2;i++,j--)
                {
                    char temp;
                    temp = s1[i];
                    s1[i] = s1[j];
                    s1[j] = temp;
                }
            }
            else if(a == '1')
            {
                s1.insert(s + e,s3);
//                cout<<s1<<endl;
                s1.erase(s,e);
            }
            cout<<s1<<endl;
        }

    }
}
用C++类库超级方便

发表于 2018-03-20 22:56:41 回复(0)
# include <stdio.h>
# include <string.h>

int main()
{
    char buf[120];
    char buf2[120];
    int n,i,j,k;
    //printf("%d",'0');
    while(scanf("%s",buf)!=EOF)
    {
        scanf("%d",&n);
        char cmd[110];
        for(i=0;i<n;i++)
        {
            scanf("%s",cmd);
            int length1 = strlen(buf);
            int length2 = strlen(cmd);
            int start,len;
            if(cmd[0]=='0')
            {
                start = cmd[1]-48;
                len = cmd[2]-48;
                for(j=start,k=start+len-1;j<start+len;)
                {
                    char tmp = buf[j];
                    buf[j] = buf[k];
                    buf[k] = tmp;
                    j++;
                    k--;
                    if(j>=k)    break;
                }
            }
            if(cmd[0]=='1')
            {
                start = cmd[1]-48;
                int tmp = start;
                len = cmd[2]-48;
                for(j=0;j<length1;j++)
                {
                    buf2[j] = buf[j];
                }
                buf2[j] = '\0';
                for(j=3;j<length2;j++)
                {
                    buf[tmp++] = cmd[j];
                }
                for(j=start+len;j<=length1;j++)
                {
                    buf[tmp++] = buf2[j];
                }
            }
            printf("%s\n",buf);
        }
    }
    return 0;
}
 
发表于 2018-02-19 16:20:14 回复(0)
import java.util.Scanner;
public class Main{
    public void problem9(){
        Scanner input = new Scanner(System.in);
        String strData = input.next();
        int N = input.nextInt();
        String order = null;
        int firstBit,startBit,lenBit;
        // 主循环
        for(int i = 0 ;i < N ;i++){
            order = input.next();
            firstBit = Integer.valueOf(order.substring(0, 1));
            startBit = Integer.valueOf(order.substring(1, 2));
            lenBit = Integer.valueOf(order.substring(2, 3));
            if(firstBit == 0){
                String temp = strData.substring(startBit, lenBit+startBit);
                char[] mainChars = strData.toCharArray();
                char[] subChars = temp.toCharArray();
                for(int j = subChars.length-1 , index = startBit;j >= 0 ;j--,index++){
                    mainChars[index] = subChars[j];
                }
                strData = String.valueOf(mainChars);
                System.out.println(strData);
            }else if(firstBit == 1) {
                String midStr = order.substring(3);
                String firstStr = strData.substring(0,startBit);
                String endStr = strData.substring(startBit+lenBit);
                strData = firstStr+midStr+endStr;
                System.out.println(strData);
            }
        }
        
    }
        public static void main(String[] args) {
        new Main().problem9();
    }
}
java版本的解法
其中substring(a, b)方法求的是[a,b-1]子串
编辑于 2018-02-07 20:54:09 回复(0)
#include<iostream>
#include<cstring>
#define N 101
using namespace std;
int main()
{
    char a[N];
 while(cin>>a)
 {
  int k = strlen(a);//用来标记数组的长度,因为数组长度在后面会变化 
  int i;cin>>i;
  for(int j = 0;j<i;j++)
  {
   char b[N];//a,b就只题目要求输入的两个字符串 
   cin>>b;   
   if(b[0]=='0')//翻转可能 
   {
    int a1 = b[1] - '0';
    int a2 = a1+b[2] - '0'-1;
    for(int a3 = a1,a4 = a2;a4>a3;a3++,a4--)
    {
     int temp = a[a3];
     a[a3] = a[a4];
     a[a4] = temp;
    }
   }//-b[2]+'0'
   else//替换可能 
   {    
    int b1 = strlen(b)-3-b[2]+'0';
    if(b1>0)//这里数组长度增加 
    {
     for(int m = k-1;m>=b[1]-'0';m--)
     a[m+b1] = a[m];
     k+=b1;
    }
    else{//数组长度降低 
     for(int m = b[1]+b[2]-'0'-'0';m<k;m++)
     a[m+b1] = a[m];
     k+=b1;
    }
    for(int m = b[1]-'0',n = 3;n<strlen(b);m++,n++)
    {
    // cout<<"a"<<endl;
     a[m] = b[n];
    }
   }
   for(int m = 0;m<k;m++)cout<<a[m];cout<<endl;
  }
  } 
    return 0;
}//题目挺简单的就是要求一步一步的算出来,祝好运,另点赞 

发表于 2017-04-25 22:53:15 回复(0)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

int i,len,l;
void Reverse(char str[],int i,int l)
{
	char c;
	int p,k;
	for(p=i,k=i+len-1;p<k;p++,k--)
	{
		c=str[p];
		str[p]=str[k];
		str[k]=c;
	}
}

void Replace(char str[],char s[])
{
	int p,l2;
	i=s[1]-'0';
	len=s[2]-'0';
	l2=strlen(s)-3;
	for(p=l;p>i;p--)
		str[p+l2-len]=str[p];		 
	for(p=i;p<=i+l2-1;p++)
		str[p]=s[p-i+3];			

}

int main()
{
	char str[204],s[100],r[22][102];
	int j,n;
	while(gets(str))
	{
		cin>>n;
		getchar();
		for(j=1;j<=n;j++)
		{
			l=strlen(str);
			gets(s);
			if(s[0]=='0')
			{
				i=s[1]-'0';
				len=s[2]-'0';
				Reverse(str,i,len);
			}else if(s[0]=='1')
				Replace(str,s);
			//puts(str);
			strcpy(r[j],str);
		}
		for(j=1;j<=n;j++)
			puts(r[j]);
	}	
	return 0;
}
我的代码运行时输出结果是与答案完全一致的,但是系统为什么显示我的输出为空白?
另外其余几个测试点应该都正确了,说明输出是没问题的。
发表于 2016-02-02 21:46:50 回复(1)
  我发现,好多字符串的操作题用C++自带函数写,几行就搞定了,很无脑。。。虽然不太好,但机试能过。。。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    string s,order[100];
    int n;
    while(cin>>s>>n)
    {
        for(int i=0;i<n;i++)cin>>order[i];
        for(int i=0;i<n;i++)
        {
            int option=order[i][0]-'0',start=order[i][1]-'0',length=order[i][2]-'0';
            if(option==0)
                reverse(s.begin()+start,s.begin()+start+length); 
            else
                s.replace(start,length,order[i].substr(3,order[i].length()-3));
            cout<<s<<endl;
        }
    }
    return 0;
} 

发表于 2018-03-18 18:22:23 回复(3)

python solution:

while True:
    try:
        s, a = input(), int(input())
        for i in range(a):
            command = input()
            start = int(command[1])
            end = int(command[2]) + start
            if command.startswith("0"):
                s = s[:start] + s[start:end][::-1] + s[end:]
            else:
                s = s[:start] + command[3:] + s[end:]
            print(s)
    except:
        break
发表于 2017-10-17 08:55:09 回复(1)
#include<iostream>
(720)#include<sstream>
#include<algorithm>
(831)#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
	
	int n; 
	string x;
	string q[100];
	char z[100];
	while (cin >> x >> n)
	{
		for (int i = 0; i < n; i++)
			cin >> q[i];
		for (int i = 0; i < n; i++)
		{
			int a = q[i][1] - 48;
			int b = q[i][2] - 48;
			if (q[i][0] == '0')
			{

				reverse(x.begin() + a, x.begin() + a + b);    //第一个参数起始位置(从零开始) ,第二个参数结束位置(到前一个)
				cout << x << endl;

			}
			else
			{
				string d;
				for (int j = 3; j < q[i].size(); j++)     //替换给定范围字符串
					d.append(1, q[i][j]);
				q[i].erase(0, 3);
				x.replace(a, b, q[i]);
				//atoi(d.c_str());  字符串化整型
				cout << x << endl;
			}




		}
	}
	

	
}

发表于 2020-03-11 16:40:49 回复(1)