剑指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(); } }
相关文章推荐
- 九度题目1372:最大子向量和(连续子数组的最大和) 剑指offer
- 《剑指Offer》题目——斐波拉契数列
- 《剑指Offer》题目:链表中倒数第k个结点
- 剑指offer面试题目:第一个只出现一次的字符
- fibonacci数列的题目——剑指Offer
- 《剑指Offer》题目——从尾到头打印链表
- 《剑指Offer》题目:合并两个排序的链表
- 剑指offer重要题目整理总结
- 剑指offer--找规律题目(斐波那契数列、跳台阶)
- 剑指Offer题目:字符串的排列
- 剑指Offer题目JAVA版思路与代码(六)
- 剑指offer 面试题三 题目二
- 剑指offer--DP类题目汇总
- 又通过一道题目,替换字符串 —— 剑指Offer
- 《剑指Offer》题目——位运算
- 剑指offer-题目1389:变态跳台阶(2014.1.5)
- 《剑指Offer》题目——二维数组中的查找
- 《剑指Offer》题目:树的子结构
- 剑指offer面试题目:和为 s 的两个数字
- 剑指offer重点复习题目