剑指Offer(第二版)面试题5:替换空格

来源:互联网 发布:历史通俗演义软件下载 编辑:程序博客网 时间:2024/06/07 23:34


(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/71478310冷血之心的博客)


题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”



这个题目我们可以用API中的replace()搞定,但是让自己写个算法实现呢?

方法:通过设立两个指针,建立一个辅助数组。从后往前或者从前往后移动指针。

/* * 剑指Offer面试题5:替换空格 * 题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.” */public class Test {public static void main(String[] args) {//String string ="cj ns";//String string ="cj ns ";//String string =" cj  ns";//String string =null;String string ="   ";System.out.println(replaceBlank(string));}/** * 思路:再建立一个辅助数组,从前往后或者从后往前遍历原字符串,同时移动两个指针 * 时间复杂度是O(n) * 空间复杂度也是O(n) * @param arr * @return */private static String replaceBlank(String string) {if(string==null)return null;int originLength = string.length();int numOfBlank = 0; // 记录空格数char[] charArray = string.toCharArray();for (int i = 0; i < charArray.length; i++) {if(charArray[i]==' ')numOfBlank++;}int newLength = originLength+numOfBlank*2; // 替换后的字符串长度char[] newcharArray = new char[newLength];// 分别设置两指针// 以下是指针从前往后移动int indexOfOriginal = 0;int indexOfNew = 0;while(indexOfOriginal<originLength){if(charArray[indexOfOriginal]==' '){newcharArray[indexOfNew++] = '%';newcharArray[indexOfNew++] = '2';newcharArray[indexOfNew++] = '0';indexOfOriginal++;}else {newcharArray[indexOfNew++] = charArray[indexOfOriginal++];}}// 以下是指针从后往前移动/*int indexOfOriginal = originLength-1;int indexOfNew = newLength-1;while(indexOfOriginal>=0&&indexOfOriginal<indexOfNew){if(charArray[indexOfOriginal]==' '){newcharArray[indexOfNew--] = '0';newcharArray[indexOfNew--] = '2';newcharArray[indexOfNew--] = '%';indexOfOriginal--;}else {newcharArray[indexOfNew--] = charArray[indexOfOriginal--];}}*/return String.valueOf(newcharArray);}}


举一反三:合并有序数组

LeetCode第88题,链接:https://leetcode.com/problems/merge-sorted-array/#/description


Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.

该题不允许建立辅助数组,即不可以另外开辟空间。通过设置指向两个数组尾部的两个指针,并且进行元素大小的比较,减少了移动次数,时间复杂度为O(N)
public class Main {     public static void main(String[] args) {          int[] a= {1,2,4,0,0};          int[] b = {2,3};          merge(a, 3, b, 2);          for (int i : a) {              System.out.println(i);          }     }     public static void merge(int[] nums1, int m, int[] nums2, int n) {                    int i = m - 1, j = n - 1, k = m + n - 1;          // 遍历数组,从后边开始,j>=0说明较短的数组中至少有一个元素        while(j >= 0){            if(i >= 0 && nums1[i] > nums2[j])               nums1[k --] = nums1[i --];           else               nums1[k --] = nums2[j --];       }     }}



如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~





5 1
原创粉丝点击