最近看了《编程之法:面试和算法心得》这本书,被各种高深的算法给膜拜了(本人职场小白,开发经验有限,抱着一颗学习的心,向大神学习),在这里整理了书中的部分算法,主要有两个目的:
1、做记录,为了以后使用方便查询。
2、分享学习,发表博客分享好东西,大家相互学习,有什么错误的地方,也请各位大神指教!
本文章是以《编程之法:面试和算法心得》书籍作为基础,将书籍中的算法使用java语言进行整理,以及个人所列举的计算方法,本文章根据本书中的第一章第一节字符串的旋转进行整理,并且提出了本人平时使用的计算方法(本人方法卓略,大神勿喷),以供日后查阅,及分享!
以下为个人根据书籍整理的算法,以java语言编程,代码如下:
package bianchengzhifaExample;
/**
* 将字符串前m位移到字符串的第n位之后
* @author cyz
*
*/
public class Reverse {
/**
* 逐字位移
* @param s
* @param n 字符串长度
* @param m 需反转字符串长度
* @return
*/
public String LeftRotateString1(char[] s,int n ,int m){
while (m-->0) {
LeftShiftOne(s,n);
}
String str="";
for (int i = 0; i < s.length; i++) {
str+=s[i];
}
return str;
}
public void LeftShiftOne(char[] s,int n){
char t=s[0];
for (int i = 1; i < n; i++) {
s[i-1]=s[i];
}
s[n-1]=t;
}
/**
* 三步反转(使用时该方法时n一定要大于m)
* @param s
* @param n 被反转字符串位置
* @param m 需反转字符串长度
*/
public String LeftRotateString2(char[] s,int n,int m){
m%=n;
ReverseString(s, 0, m-1);
ReverseString(s, m, n-1);
ReverseString(s, 0, n-1);
String str="";
for (int i = 0; i < s.length; i++) {
str+=s[i];
}
return str;
}
public void ReverseString(char[] s,int from ,int to){
while (from<to) {
char t=s[from];
s[from++]=s[to];
s[to--]=t;
}
}
public String LeftRotateString3(){
return new String();
}
public static void main(String[] args) {
Reverse r=new Reverse();
String str="abcdefghijklmnopq";
System.err.println("-----------使用逐位反转----------------");
System.err.println("str反转前:"+str);
char[] s1=str.toCharArray();
String str1=r.LeftRotateString2(s1, 2, 1);
// String str1=r.LeftRotateString1(s1, str.length(), 4);
System.err.println("str反转后:"+str1);
System.err.println("-----------使用三步反转----------------");
System.err.println("str反转前:"+str);
char[] s2=str.toCharArray();
String str2=r.LeftRotateString2(s2, 2, 1);//
// String str2=r.LeftRotateString2(s2, str.length(), 4);
System.err.println("str反转后:"+str2);
}
}