剑指offer面试题4 替换一个字符串中的空格为 O(n)算法 和把两个有序数组合起来 依旧有序的算法

/*
这个题目的背景就是网络编程 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值