import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
public class test1 {
public static final Logger log = Logger.getLogger(test1.class);
static Map<Integer, String> ch = new LinkedHashMap<Integer, String>(27);
public static void main(String[] args) {
initData();
one();
System.out.println("=================分割线====================");
two("d2", "h66");
}
/**
* 用于把26个字母填充到ch中
*/
public static void initData() {
Integer t = 0;
for (char i = 'a'; i <= 'z'; i++) {
ch.put(t, i + "");
t++;
}
}
// 1 .分别用 java 和 javascript 建一棵树 ,
//
// a
// b1 b2
// c1 c2 c3 c4 c5 c6
// ......
//
// z1 z2 ...
//
// a) 共26层
// b) 第一层 1 个节点
// c) 对 n>1, 第n层会有n * (n-1层的节点数) 个节点
// d) 对 n>=1 and n<=25, 第n层的每个点都有n+1个下节点(儿子)
public static void one() {
// 0×2+1=1
// 1×3+2=5
// 5×4+3=23
// 23×5+4=119
BigInteger bi = new BigInteger("1");
for (int i = 0; i < ch.size(); i++) {
bi = bi.multiply(new BigInteger((i + 1) + ""));
System.out
.println(ch.get(i) + " 第" + (i + 1) + "行,总数:" + bi + "\t");
/*************************************************************/
// 之所以中断这一段代码,是因为运行起来特别耗时
/*************************************************************/
for (BigInteger b = BigInteger.ZERO; b.compareTo(bi) < 0; b = b
.add(BigInteger.ONE)) {
System.out.print(ch.get(i) + "" + (b.add(BigInteger.ONE))
+ "\t");
}
if (i == 6) {
break;
}
System.out.println();
}
System.out.println();
}
/**
* @Description: 判断 改动后的树是否存在上下级递归的关系(如果向上相隔2层,肯定存在上下级递归关系,还要一种情况是相邻的两个字母)
*
* @param s1
* 原字母
*
* @param s2
* 新字母
*
*/
public static boolean two(String s1, String s2) {
int size_1 = Integer.valueOf(s1.substring(1));
s1 = s1.substring(0, 1);
int index_1 = Integer.valueOf(getKeyByValue(ch, s1).get(0).toString()) + 1;
long count1 = getCount(index_1);
int size_2 = s2.equals("a") ? 0 : Integer.valueOf(s2.substring(1));
s2 = s2.substring(0, 1);
int index_2 = Integer.valueOf(getKeyByValue(ch, s2).get(0).toString()) + 1;
long count2 = getCount(index_2);
System.out.println("字母:" + s1 + "\t所在层:" + index_1 + "\t共有节点:" + count1
+ "\t所在列" + size_1);
System.out.println("字母:" + s2 + "\t所在层:" + index_2 + "\t共有节点:" + count2
+ "\t所在列" + size_2);
if (index_1 - index_2 > 1) {
System.out.println("存在上下级关系");
return true;
} else {
long start = (size_2 - 1) * (index_2 + 1);
long end = (size_2) * (index_2 + 1);
if (size_1 > start && size_1 <= end) {
System.out.println("字母" + s2 + "的下级子节点的区间为:" + s1 + start + "-"
+ end);
System.out.println("存在上下级关系");
return true;
} else {
System.out.println("不存在上下级关系");
return false;
}
}
}
/**
* @Description: 根据所在层取得节点数
* @param num
* 所在层(如 a表示在第一层)
* @return long
* @throws 由于收到long长度的影响
* ,该段代码存在bug
*/
public static long getCount(long num) {
long count = 1;
for (int i = 0; i < num; i++) {
count = count * (i + 1);
}
return count;
}
/**
* @Description: 根据value取得key
* @param map
* @param value
* @return List value
*/
public static List getKeyByValue(Map map, Object value) {
List keys = new ArrayList();
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Entry) it.next();
Object obj = entry.getValue();
if (obj != null && obj.equals(value)) {
keys.add(entry.getKey());
}
}
return keys;
}
}