1593 - 查找2

读入一组字符串(待操作的),再读入一个int n记录记下来有几条命令,总共有2中命令:1、翻转  从下标为i的字符开始到i+len-1之间的字符串倒序;2、替换  命令中如果第一位为1,用命令的第四位开始到最后的字符串替换原读入的字符串下标 i 到 i+len-1的字符串。每次执行一条命令后新的字符串代替旧的字符串(即下一条命令在作用在得到的新字符串上)。

    命令格式:第一位0代表翻转,1代表替换;第二位代表待操作的字符串的起始下标int i;第三位表示需要操作的字符串长度int len。

题目输入


输入有多组数据。<br />

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

<br />

题目输出


根据指令对字符串操作后输出结果。

<br />

输入/输出样例

题目输入

ghhtdrj
2
002
114dwae

题目输出

hghtdrj
hdwaerj

C语言解答

#include<stdio.h>
#include<string.h>
#include<math.h>
main(){
	int n,i,len,k1,k2,j;
	char s[101],temp,ins[101];
	while(scanf("%s",s)!=EOF){
		scanf("%d",&n);
		while(n--){
			scanf("%s",&ins);
			k1=ins[1]-'0';
			k2=ins[2]-'0';
			if('0'==ins[0]){
				for(i=k1,j=k2+k1-1;j>=i;i++,j--){
					temp=s[i];
					s[i]=s[j];
					s[j]=temp;
				}
				printf("%s\n",s);
			}
			if('1'==ins[0]){
				for(i=k1,j=0;j<k2;j++,i++)
					s[i]=ins[j+3];
				printf("%s\n",s);
			}
		}
	}
	return 0;
}

C++解答

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<ctype.h>


void reverse(char a[],int start,int len);
void tihuan(char a[],char b[],int start,int len);


int main()
{
    char string[200];
    int n;
    char **cmd;
    int i;
    while(gets(string)!=NULL)
    {
      scanf("%d",&n);
      cmd=(char**)malloc(sizeof(char*)*n);
      for(i=0;i<n;i++)
      {
        cmd[i]=(char*)malloc(sizeof(char)*104);
      }

      getchar();

      for(i=0;i<n;i++)
      {  
         gets(cmd[i]);
         
      } 
      //判断类型 
      for(i=0;i<n;i++)
      {
         if(cmd[i][0]=='0')
         { 
            // if(strlen(cmd[i])==3)
             reverse(string,cmd[i][1]-'0',cmd[i][2]-'0');
            // else if(strlen(cmd[i])==5)
            // reverse(string,(cmd[i][1]-'0')*10+(cmd[i][2]-'0'),(cmd[i][3]-'0')*10+(cmd[i][4]-'0'));
            // else if(strlen(cmd[i])==4)
            // reverse(string,cmd[i][1]-'0',(cmd[i][2]-'0')*10+(cmd[i][3]-'0'));
         }
         else
            tihuan(string,cmd[i],cmd[i][1]-'0',cmd[i][2]-'0');
      }
      
      for(i=0;i<n;i++)
     {
        free(cmd[i]);
     } 
     
     free(cmd);
     
    }
    
    return 0;
} 

void reverse(char a[],int start,int len)
{
     int temp1=len/2;//中间位置 
     int i,j,k;
     char temp2;
     for(i=start,j=start+len-1,k=0;k<temp1;k++)
     {
        temp2=a[i];
        a[i++]=a[j];
        a[j--]=temp2;
        
     }
    puts(a); 
     
}
void tihuan(char a[],char b[],int start,int len)
{
    //判断被覆盖的字符数量,和要覆盖的字符数量之间的大小关系,
    //分成3种情况处理,
    //若大于,则往前挪
    //若小于,则往后挪
    //若相等,无需挪动
    int total_b=strlen(b)-3;
    int i;
    int a_move; 
    int gap;
    if(len==total_b)
    {
       for(i=0;i<len;i++)
       {
          a[start+i]=b[3+i];
       }
    } 
    else if(len<total_b)
    {
         gap=total_b-len;
         a_move=start+len;
         for(i=strlen(a);i>=a_move;i--)
         {
            a[i+gap]=a[i];
         }  
          for(i=0;i<total_b;i++)
          {
             a[start+i]=b[i+3];
          }
          
    }
    else 
    {
      gap=len-total_b;
      for(i=len+start;i<=(int)strlen(a);i++) 
      {
          a[i-gap]=a[i];
      }
      for(i=0;i<total_b;i++) 
      {
        a[start+i]=b[3+i];
      }
    }
      
        puts(a);
    
}
时间限制 1 秒
内存限制 32 MB
讨论 统计
上一题 下一题