您的位置:首页 > Web前端

剑指Offer——题目2

2019-06-11 17:19 936 查看
版权声明:转载,引用,需附上原文的链接地址! https://blog.csdn.net/romantic_jie/article/details/91449626

第一种思路,可以申请额外的空间,即替换结果存放在新的char数组中。 

[code]/* 日期:2019.6.11
* 作者:刘烜杰
* 功能:剑指offer题目练习二
* ======================================================
* 题目描述:
* 请实现一个函数,将一个字符串中的每个空格替换成“%20”。
* 例如,当字符串为We Are Happy.
* 则经过替换之后的字符串为We%20Are%20Happy。
* =======================================================
* 该解答过程使用了额外的char数组保存新的结果,所以需要空间
* 时间复杂度:O(n)  涉及到两次一维遍历
* 空间复杂度:O(n) 申请了额外的空间保存结果
* */
package com.liuxuanjie;

import java.util.*;

public class Main2 {

//主函数,作为程序测试入口
public static void main(String []args)
{
Main2 main2 = new Main2();
StringBuffer string = new StringBuffer("we are happy");
String str = main2.replaceSpace(string);
System.out.println(str);
}

public String replaceSpace(StringBuffer str) {

//字符串操作的特殊情况的考虑:
if(str == null || str.length() < 0) return null;
if(str.length() == 0) return "";

//正常的实现
int len = str.length();		//记录字符长的长度
int countSpace = 0;		//记录包含空格的数量

for(int i = 0; i < len; i++)	//遍历一遍找到空格的数量
if(str.charAt(i) == ' ')
countSpace++;

int len2 = len + 2 * countSpace;	//得到新的替换后的长度
char [] array = new char[len2];		//使用char数组保存新的替换结果

//这里的从后往前插入没有任何意义,只是为了利用一下len变量,不需要在申请一个变量而已
//从前往后添加,只不过需要一个额外的变量来指示遍历到了哪里
for(int i = len2 - 1; i >= 0; i--,len--)
{
char ch = str.charAt(len - 1);	//从原字符串取出字符
if(ch != ' ')	array[i] = ch;  //不是空格,直接扔到新字符串应该存在的位置
else 	//是空格,替换为题目要求
{
array[i--] = '0';
array[i--] = '2';
array[i] = '%';
}
}
return String.valueOf(array);
}
}

2.不使用额外的空间,直接使用原来的stringbuffer,注意这时,就必须从后边开始移动

[code]
* 时间复杂度:O(n)  涉及到两次一维遍历
* 空间复杂度:O(1)
* */
package com.liuxuanjie;

import java.util.*;

public class Main22 {

//主函数,作为程序测试入口
public static void main(String []args)
{
Main22 main22 = new Main22();
StringBuffer string = new StringBuffer("hello ");
String str = main22.replaceSpace(string);
System.out.println(str);
}

public String replaceSpace(StringBuffer str) {

if(str == null && str.length() < 0) return null;
if(str.length() == 0) return "";

int lenOld = str.length();
System.out.println(lenOld);
int count = 0;
for(int i = 0; i < lenOld; i++)
if(str.charAt(i) == ' ')
count++;
System.out.println(count);

int lenNew = lenOld + 2 * count;
str.setLength(lenNew);

for(int i = lenNew - 1; i >= 0; i--,lenOld--)
{
char ch = str.charAt(lenOld - 1);	//从原字符串取出字符
if(ch != ' ')	str.setCharAt(i, ch);  //不是空格,直接扔到新字符串应该存在的位置
else 	//是空格,替换为题目要求
{
str.setCharAt(i--, '0');
str.setCharAt(i--, '2');
str.setCharAt(i, '%');
}
}

return str.toString();
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: