/*
这个题目的背景就是网络编程 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;
}
剑指offer面试题4 替换一个字符串中的空格为 O(n)算法 和把两个有序数组合起来 依旧有序的算法
最新推荐文章于 2024-07-21 12:35:38 发布