算法:部分字符串按顺序换位

京东达达遇到的一个面试算法题:
设计一个算法:
方法有两个参数,第一个是一个字符串,另一个是一个整数n,整数代表讲字符串前n位换到字符串的末尾,eg :输入:“abcdefg”,3 输出: “defgabc”; 使用O(1)的空间复杂度如何完成。
第一想法是是使用native方法arrayCopy来做,效率较高,只需要开辟一段空间即可。
面试官听说这种想法后,立即加了个限制的条件,使用O(1)的空间复杂度来完成,空间复杂度降低,无疑就是采用时间换空间的思想,当时一时间没想出来,今天把想出来的算法记录下来。

/** * @author :tigermeng. * @date :16:59 2019-07-26 */

package com.mhc.pf;

import org.junit.Test;

import java.util.LinkedList;

/**
*

  • 面试题: 方法参数(String,int)
  •   达到结果:eg("abcde",3)--> "deabc"
    
  • @author :tigermeng.
  • @date :16:59 2019-07-26

*/
public class ReversePartString {

/**
 * 空间复杂度为O(n)
 * @param s
 * @param c
 * @return
 */
public String reversePart(String s,int c){
    char[] chars = s.toCharArray();
    int len = chars.length;

    char[] newChar = new char[len];
    System.arraycopy(chars,c,newChar,0,len-c);
    System.arraycopy(chars,0,newChar,len-c,c);
    return new String(newChar);
}


/**
 * 空间复杂度为O(1)  时间换空间
 * @param s
 * @param c
 * @return
 */
public String reversePart1(String s,int c){
    char[] chars = s.toCharArray();
    int len = chars.length;
    char temp;
    //双重循环来处理
    for (int d = c; d < len; d++) {
        temp=chars[d];//保存当前数
        for (int i = d; i >d-c; i--) {
            //之前的数后挪
            chars[i] = chars[i-1];
        }
        chars[d-c]=temp;
    }

    return new String(chars);
}

@Test
public void test(){
    System.out.println(reversePart("abcde", 3));
    System.out.println(reversePart1("abcde", 3));
}

}

点赞