常用的自编函数及算法技巧

编程的快捷工具

  1. 最大公约数:

辗转相除法公式: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);
	}	//辗转相除法
  1. 全排列递归框架

  • 集合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;
		}
	}			//实现字符数组的全排列
  1. 字典序排序(不是重点)

字典序,顾名思义,就是按照字典的顺序进行排列。根据维基百科的定义:给定两个偏序集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
  1. 奇偶数判断

  • a[0]&1 —— 按位与操作
  1. 二维数组中a[i][j]的对角线元素下标的特点
    ——位于同一主对角线上的下标横纵坐标之差与i-j之差一致;位于同一副对角线上的下标横纵坐标之和与i+j之和一致。

  2. n行n列的二维数组从上到下,从左到右扫描。a[i][j]的下一个元素的坐标是(i+(j+1)/n,(j+1)%n)

  3. 素数的判断:

private static boolean isP(int k) {
    for (int i = 2; i * i <= k; i++) {
      if (k % i == 0) return false;
    }
    return true;
  1. 字典序输出的问题
    ——用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		
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值