编程的快捷工具
辗转相除法公式:gcd(a,b) = gcd(b,a mod b)。
static int gcd(int a,int b) {
if(b==0)
return a;
return gcd(b,a%b);
} //辗转相除法
- 集合Set自带去重功能
static void f(char[]a,int k) {
if(a.length==k) { //递归出口,也称递归结束条件
String s = new String(a);
if(check(s))
set.add(s);
}
for(int i=k;i<a.length;i++) { //变换
char temp = a[k];
a[k] = a[i];
a[i] = temp;
f(a,k+1); //递归链条
temp = a[k]; //还原
a[k] = a[i];
a[i] = temp;
}
} //实现字符数组的全排列
字典序,顾名思义,就是按照字典的顺序进行排列。根据维基百科的定义:给定两个偏序集A和B,(a,b)和(a′,b′)属于笛卡尔集 A × B,则字典序定义为(a,b) ≤ (a′,b′) 当且仅当 a < a′ 或 (a = a′ 且 b ≤ b′)。所以给定两个字符串,逐个字符比较,那么先出现较小字符的那个串字典顺序小,如果字符一直相等,较短的串字典顺序小。例如:abc < abcd < abde < afab。
总结一下,字典序排序其实就是同一组字符组成的一系列字符串,
起点: 字典序最小的排列, 1~n , 例如12345
终点: 字典序最大的排列,n~1, 例如54321
过程: 从当前字符串排列生成字典序刚好比它大的下一个排列,比如12345的字典序下一个排列是12354
- a[0]&1 —— 按位与操作
-
二维数组中a[i][j]的对角线元素下标的特点
——位于同一主对角线上的下标横纵坐标之差与i-j之差一致;位于同一副对角线上的下标横纵坐标之和与i+j之和一致。 -
n行n列的二维数组从上到下,从左到右扫描。a[i][j]的下一个元素的坐标是(i+(j+1)/n,(j+1)%n)
-
素数的判断:
private static boolean isP(int k) {
for (int i = 2; i * i <= k; i++) {
if (k % i == 0) return false;
}
return true;
- 字典序输出的问题
——用Collections.sort()函数来实现按字典序排序
List<String> list = new ArrayList<String>();
list.add("b");
list.add("abc");
list.add("acb");
Collections.sort(list);
for(String i:list)
System.out.println(i);
/*输出:
abc
acb
b
*/