剑指offer面试题4 替换一个字符串中的空格为 O(n)算法 和把两个有序数组合起来 依旧有序的算法
来源:互联网 发布:淘宝上的古董店 编辑:程序博客网 时间:2024/05/18 00:52
/*这个题目的背景就是网络编程 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;}