《编程珠玑》第二章 “杂技算法” 和 “翻转算法” Java语言版
之前一篇文章讲了http://blog.csdn.net/tcpipstack/article/details/8125759字符串翻转里面的 “杂技算法” 和 “翻转算法” 的C语言实现,最近完成了上述算法的Java实现,具体代码如下所示:
杂技算法源码:
package chapter2;
import java.util.ArrayList;
import java.util.List;
/**
* Name:杂技算法
*
* @author tcpipstack
* @version 1.0
*
*/
public class AcrobatsArray {
public AcrobatsArray() {
}
public List<String> rotation(List<String> list, int rotdist) {
int m = gcd(rotdist, list.size());
int j = 0;
for (int i = 0; i < m; i++) {
String temp = list.get(i);
j = i;
while (true) {
int k = j + rotdist;
if (k >= list.size()) {
k -= list.size();
}
if (k == i) {
break;
}
list.set(j, list.get(k));
j = k;
}
list.set(j, temp);
}
return list;
}
/**
* Name: 求最大公约数(Greatest common divisor)
*
* @param i
* @param j
* @return
*/
private int gcd(int i, int j) {
while (i != j) {
if (i > j) {
i -= j;
} else {
j -= i;
}
}
return i;
}
/**
* @param args
*/
public static void main(String[] args) {
AcrobatsArray strArr = new AcrobatsArray();
MyList myList = new MyList();
List<String> list = myList.createStringList(10);
System.out.println("*****Before*****");
myList.print(list);
List<String> result = strArr.rotation(list, 3);
System.out.println("\n*****After*****");
myList.print(result);
}
}
翻转算法源码:
package chapter2;
import java.util.ArrayList;
import java.util.List;
/**
*
* Name: Inverse the array
*
* @author tcpipstack
* @version 1.0
*
*/
public class InverseArray {
public InverseArray() {
}
/**
* Name: Inverse the elements of the list
*
* @author long.luo
* @param list
* @param begin
* @param end
* @return list
*/
private List<String> reverseList(List<String> list, int begin, int end) {
if (begin <= end) {
for (int i = begin; i < end; i++, end--) {
if (i < end - 1) {
String temp = list.get(i);
list.set(i, list.get(end - 1));
list.set(end - 1, temp);
}
}
}
return list;
}
/**
* @param args
*/
public static void main(String[] args) {
MyList myList = new MyList();
List<String> list = myList.createStringList(10);
System.out.println("*****Before*****");
myList.print(list);
InverseArray inverseArray = new InverseArray();
inverseArray.reverseList(list, 0, 5);
inverseArray.reverseList(list, 5, 10);
inverseArray.reverseList(list, 0, 10);
System.out.println("\n*****After*****");
myList.print(list);
}
}
class MyList {
public MyList() {
}
/**
* Name:产生String类型的list
*
* @author long.luo
* @param length
* @return
*/
public List<String> createStringList(int length) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < length; i++) {
list.add(String.valueOf(i));
}
return list;
}
/**
* Name:print the list elements
*
* @author long.luo
* @param list
*/
public void print(List<String> list) {
for (int i = 0; i < list.size(); i++) {
System.out.printf(" " + list.get(i));
}
}
}