替换空格

题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

思路分析:

可以想到两种解决方案

第一种创建新的字符串,在新的字符串中进行替换

第二种就是在原来的字符串上做替换,并且保证输入的字符串后面有足够多的多余空间

这里我用的是第二种在原来字符串上进行替换,替换的顺序有两种,从前向后替换和从后向前替换,从前向后替换时间复杂度为 O(n2) ,所以还是采用的从后向前替换的方法,这样的话,字符挪动的次数就是一次,也就字符串长度为n,时间复杂为 O(n)

具体实现及相关过程:

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

void replaceBlank(char *s, int length);
void replaceBlank(char *s, int length) {
    int originLength = 0,
        newLength = 0,
        numberOfBlank = 0,
        i = 0,
        originIndex = 0,
        newIndex = 0;

    //得到实际字符串的长度和空格的个数 
    while(s[i] != '\0') {
        originLength++;

        if(s[i] == ' ') {
            numberOfBlank++;
        }
        i++;
    }

    //计算出新的字符串的长度(一个空格使得长度增加2) 
    newLength = originLength + numberOfBlank * 2;

    //originIndex指向原来字符串的最后一个字符 
    originIndex = originLength;
    //newIndex指向新字符串的最后一个字符 
    newIndex = newLength;

    /*
    当originIndex指向的是一个空格的时候,就需要用'%20'进行替换
    (这个过程中newIndex需要移动三个位置),否则就要进行复制,
    将originIndex所指向的字符复制到newIndex所指向的位置,然后
    originIndex不断向前移动    
    */ 
    while(originIndex >= 0 && newIndex > originIndex) {
        if(s[originIndex] == ' ') {
            s[newIndex--] = '0';
            s[newIndex--] = '2';
            s[newIndex--] = '%';
        } else {
            s[newIndex--] = s[originIndex];
        }
        originIndex--;
    } 
}

void main(void) {
    char s[100];
    gets(s);
    replaceBlank(s, 100);
    puts(s);
} 

创建新的字符串的解法:

package com.offer.exec;

import java.util.Scanner;

public class ReplaceBlank { 
    public String replace(StringBuffer s) {
        if(s == null) {
            return null;
        }

        StringBuffer str = new StringBuffer();

        for(int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == ' ') {
                str.append('%');
                str.append('2');
                str.append('0');
            }else {
                str.append(s.charAt(i));
            }
        }

        return str.toString();

    }

    public static void main(String args[]) {
        ReplaceBlank rb = new ReplaceBlank();
        StringBuffer sb = new StringBuffer();

        Scanner in = new Scanner(System.in);
        sb.append(in.nextLine());
        System.out.println(rb.replace(sb));
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值