京东达达遇到的一个面试算法题:
设计一个算法:
方法有两个参数,第一个是一个字符串,另一个是一个整数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));
}
}