/* 这个题目的背景就是网络编程 URL中很多特殊字符导致服务器无法获得正确参数值。 所以要把空格转换称十六进制的ascii码 就是%20 但是从前往后转换的话 遇到空格 后面就得往后移动; 所以 从后往前 首先统计出一共多少个空格 这样 后面一共移动多少是可以算出来的 然后一遇到空格 就在后面追加%20 再把numofmove -=2 题还是很简单的 也很快就想到了经典啊 */ #include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; char arr[100]; void ReplaceBlank() { int NumOfMove=0; for(int i=0;arr[i];++i) if(isblank(arr[i])) NumOfMove+=2; if(NumOfMove==0) return ; int len=strlen(arr); arr[len+NumOfMove]='\0';//注意这个非常重要 int index=len-1; while(true) { if(isblank(arr[index])) { NumOfMove-=2; arr[index+NumOfMove]='%'; arr[index+1+NumOfMove]='2'; arr[index+2+NumOfMove]='0'; //strcpy(arr+index+NumOfMove,"%20");这样是不行的 因为复制完会加\0 if(NumOfMove==0) break; } else { arr[index+NumOfMove]=arr[index]; } index--; } } int main() { freopen("/home/gl/in","r",stdin); while(gets(arr))//用gets 和puts 输入和输出一行字符串 { ReplaceBlank(); puts(arr); } return 0; } /* 利用这种思想 还有一道相关题目 就是给两个数组都是有序的 第一个数组的大小 大于等于两个数组中元素个数的和 现在要把第二个数组中的数字移动到第一个 要求 移动之后还是有序的 并且复杂度O(n) 和本题的想法是类似的 用两个index 都从后往前 把大的移动到后面,并且index--; 算了 还是敲一遍把。*/ #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=100; int A[maxn],B[maxn]; int n,m; void SortTwoArray() { int index=n+m-1; int indexa=n-1; int indexb=m-1; while(indexa>=0 && indexb>=0) { if(A[indexa]>=B[indexb]) { A[index--]=A[indexa--]; } else { A[index--]=B[indexb--]; } } if(indexb>=0)//如果indexa大于等于0 就不用动了。 { A[index--]=B[indexb--]; } } void showarr(int arr[],int n) { for(int i=0;i<n;++i) printf("%d ",arr[i]); cout<<endl; } int main() { freopen("/home/gl/in","r",stdin); while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;++i) scanf("%d",&A[i]); scanf("%d",&m); for(int i=0;i<m;++i) scanf("%d",&B[i]); SortTwoArray(); showarr(A,n+m); } return 0; }