源码记录


(1)类似正则表达式匹配问题, 例如s1 = "xxxxabxxxxbxx", s2 = "ab*b??"

public class Regex {
	static boolean scan(String s1, String s2){
		for(int i=0; i<s1.length(); i++){
			int cur = i, j;
			for(j=0; j<s2.length()&&cur<s1.length(); j++){
				if(s1.charAt(cur)==s2.charAt(j)){
					cur++;
				}else if(s2.charAt(j)=='?'){
					cur++;
				}else if(s2.charAt(j)=='*'){
					String tmps1 = s1.substring(cur), 
							tmps2 = s2.substring(++j);
					boolean b = scan(tmps1, tmps2);
					if(b) return b;
					else break;
				}else if(s1.charAt(cur)!=s2.charAt(j)){
					break;
				}
			}
			if(j==s2.length()) return true;
		}
		return false;
	}
	
	public static void main(String [] args){
		String s1 = "xxaxxbxabcb";
		String s2 = "ab*b??";
		System.out.println(scan(s1, s2));
	}

}

(2)求数组集合子集递归和非递归求法。

public class FindAllSubSet {
	public static void findAllSubSet(int [] a){
		int n = a.length;
		for(int i=0; i<Math.pow(2, n); i++){
			int cur = i;
			for(int j=0; j<n; j++){
				if((cur&1)==1){
					System.out.print(a[j]+" ");
				}
				cur >>= 1;
			}
			System.out.println();
		}
	}
	static void findSubSet(int [] a, boolean [] aux, int cur){
//		System.out.println(cur);
		if(cur>=a.length){
			for(int i=0; i<aux.length; i++){
				if(aux[i])
					System.out.print(a[i]+" ");
			}
			System.out.println();
			return;
		}
		int tmp = cur;
		findSubSet(a, aux, ++tmp);
		aux[cur] = true;
		findSubSet(a, aux, tmp);
		aux[cur] = false;
	}
	public static void main(String [] args){
		int [] a = {1, 2, 3};
//		findAllSubSet(a);
		boolean [] aux = new boolean[a.length];
		findSubSet(a, aux, 0);
	}

}

(3)按照老鼠体重升序排序, 然后按速度找最大降序子序列

import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;


public class SortMices {
	static class Mice{
		int weight, speed;
		public Mice(int w, int s){
			this.weight = w;
			this.speed = s;
		}
		public String toString(){
			return "weight = "+this.weight+"  speed="+this.speed;
		}
	}
	static void findMiceSet(Mice[] ms){
		Arrays.sort(ms, new Comparator<Mice>(){
			public int compare(Mice m1, Mice m2){
				if(m1.weight>m2.weight) return 1;
				else if(m1.weight<m2.weight) return -1;
				else return 0;
			}
		});
		show(ms);
		List<Mice> list = new LinkedList<Mice>();
		for(int i=0; i<ms.length; i++){
			int j;
			for(j=0; j<list.size(); j++){
				if(ms[i].speed>list.get(j).speed) break;
			}
			if(j==list.size()) list.add(ms[i]);
			else list.set(j, ms[i]);
		}
		System.out.println(list.size());
		int pre = Integer.MIN_VALUE;
		int j = ms.length-1;
		Stack<Mice> results = new Stack<Mice>();
		for(int i=list.size()-1; i>=0; i--){
			while(j>=0){
				if(ms[j].speed>pre&&ms[j].speed<=list.get(i).speed){
					results.push(ms[j]);
					pre = ms[j].speed;
					j--;
					break;
				}
				j--;
			}
		}
		while(!results.empty()){
			Mice m = results.pop();
			System.out.println(m.weight+" , "+m.speed);
		}
	}
	static void show(Mice [] ms){
		for(int i=0; i<ms.length; i++)
			System.out.println(ms[i]);
	}
	public static void main(String [] args){
		Mice [] ms = {new Mice(2, 5), new Mice(9, 1), new Mice(8, 2), new Mice(5, 4), new Mice(3, 3)};
		show(ms);
		System.out.println("+++++++++++++++++++++++++++++");
		findMiceSet(ms);
	}

}

(4)合法的鸡蛋方法

/**
 * N个鸡蛋放入M个篮子中, 篮子不能为空, 要满足, 对任意不大于N的数量, 能用若干个篮子中的鸡蛋的和表示
 * 方法是用枚举所有可能的排列方法。
 * @author Administrator
 *
 */
public class PutEggs {
	/**
	 * 确认篮子可以组合出所有不大于N的数量
	 * @param n
	 * @param bs
	 * @return
	 */
	static boolean confirm(int n, int[] bs){
		boolean [] ns = new boolean[n+1];
		int ss = bs.length;
		for(int i=0; i<Math.pow(2, ss); i++){
			int cur = i;
			int sum = 0;
			for(int j=0; j<ss;j++){
				if((cur&1)==1){
					sum += bs[j];
				}
				cur >>=1;
			}
			ns[sum] = true;
		}
		for(int i=1; i<ns.length; i++){
			if(!ns[i]) return false;
		}
		return true;
	}
	static void show(boolean [] bs){
		for(int i=0; i<bs.length; i++){
			System.out.print(bs[i]+" ");
		}
		System.out.println();
	}
	static void show(int [] bs){
		for(int i=0; i<bs.length; i++){
			System.out.print(bs[i]+" ");
		}
		System.out.println();
	}
	/**
	 * 回溯遍历
	 * @param N
	 * @param eggs
	 * @param buckets
	 * @param cur
	 */
	static void putEggs(int N, int eggs, int [] buckets, int cur){
		if(eggs==0){
			if(cur==buckets.length&&confirm(N, buckets)){
				show(buckets);
			}
			return;
		}else if(cur==buckets.length){
			return;
		}
		
		int tmp = cur + 1;
		for(int i=eggs; i>0; i--){
			buckets[cur] = i;
			putEggs(N, eggs-i, buckets, tmp);
		}
		buckets[cur] = 0;
	}
	
	public static void main(String [] args){
		int [] bs = new int[5];
		putEggs(9, 9, bs, 0);
	}

}

(5)统计字符数

import java.util.HashMap;

/**
 * 时间复杂度O(N)时间内, 统计String中字符出现的次数
 * @author Administrator
 *
 */
public class CountChars {
	static HashMap<Character, Integer> count(String s ){
		int [] cc = new int [256];
		for(char a : s.toCharArray()){
			cc[a] ++;
		}
		HashMap<Character, Integer> counts = new HashMap<Character, Integer>();
		for(int i=0; i<cc.length; i++){
			if(cc[i]>0){
				counts.put((char)i, cc[i]);
			}
		}
		return counts;
	}
	
	public static void main(String [] args){
		String s = "AAbbaacccces";
		HashMap<Character, Integer> c = count(s);
		for(char a: c.keySet()){
			System.out.println(a+"  : "+c.get(a));
		}
	}

}

(6)输入:一个长度为n的整数数组input 
输出:一个长度为n的整数数组result,满足result[i] = input数组中除了input[i]之外所有数的乘积(假设不会溢出)。比如输入:input = {2,3,4,5},输出result = {60,40,30,24} 

public class CalculateProduct {
	
	public static int [] cal(int [] a){
		int [] re = new int[a.length];
		int pr = 1;
		for(int i=0; i<a.length; i++){
			re[i] = pr;
			pr *= a[i];
		}
		pr = a[a.length-1];
		for(int i = a.length-2; i>=0; i--){
			re[i] *= pr;
			pr *= a[i];
		}
		return re;
	}
	public static void show(int [] a){
		for(int i=0; i<a.length; i++){
			System.out.println(a[i]);
		}
	}
	public static void main(String [] args){
		int [] a = {1, 2, 3, 4, 5};
		a = cal(a);
		show(a);
	}

}

(7)有n个人排队, 每个人都有要求Request, 具体每个要求是希望排在某个人之前或者之后, 用类RequestItem表示。

例如有 1, 2, 3三个人, 1希望排在2之后3之前, 2希望排在1之前, 3希望排在1, 2之后。输出一个合理的排列

一个拓扑排序的应用

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;


class RequestItem{
	String name;
	boolean front;
}

class Request{
	String name;
	List<RequestItem> items;
}
public class FindValidOrder {
	static List<String> validOrder(List<String> names, List<Request> requests){
		HashMap<String, List<String>> maps = new HashMap<String, List<String>>();
		for(String name: names){
			maps.put(name, new LinkedList<String>());
		}
		for(Request re: requests){
			for(RequestItem item: re.items){
				if(item.front){
					List<String> tmp = maps.get(item.name);
					if(!tmp.contains(re.name)){
						tmp.add(re.name);
					}
				}else{
					List<String> tmp = maps.get(re.name);
					if(!tmp.contains(item.name)){
						tmp.add(item.name);
					}
				}
				
			}
		}
		HashMap<String, Integer> counts = new HashMap<String, Integer>();
		for(String name: names){
			counts.put(name, 0);
		}
		for(String name: names){
			List<String> tmp = maps.get(name);
			for(String s: tmp){
				int tmpcount = counts.get(s)+1;
				counts.put(s, tmpcount);
			}
		}
		List<String> queue = new LinkedList<String>();
		while(!counts.isEmpty()){
			boolean found = false;
			String next = null;
			for(String name: counts.keySet()){
				if(counts.get(name)==0){
					next = name;
					found = true;
				}
			}
			if(!found) break;
			counts.remove(next);
			for(String s: maps.get(next)){
				int tmpcount = counts.get(s)-1;
				counts.put(s, tmpcount);
			}
			queue.add(next);
		}
		if(queue.size() == names.size()) return queue;
		return null;
	}
	public static void main(String [] args){
		List<String> names = new LinkedList<String>();
		names.add("1");
		names.add("2");
		names.add("3");
		List<Request> requests = new LinkedList<Request>();
		
		Request r = new Request();
		r.name = "1";
		r.items = new LinkedList<RequestItem>();
		RequestItem item = new RequestItem();
		item.name = "2";
		item.front = true;
		r.items.add(item);
		RequestItem item2 = new RequestItem();
		item2.name = "3";
		item2.front = false;
		r.items.add(item2);
		requests.add(r);
		
		Request r2 = new Request();
		r2.name = "2";
		r2.items = new LinkedList<RequestItem>();
		RequestItem item3 = new RequestItem();
		item3.name = "1";
		item3.front = false;
		r2.items.add(item3);
		requests.add(r);
		
		Request r3 = new Request();
		r3.name = "3";
		r3.items = new LinkedList<RequestItem>();
		RequestItem item4 = new RequestItem();
		item4.name = "2";
		item4.front = true;
		r3.items.add(item4);
		RequestItem item5 = new RequestItem();
		item5.name = "1";
		item5.front = true;
		r3.items.add(item5);
		requests.add(r3);
		
		List<String> order = validOrder(names, requests);
		System.out.println(order);
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WitsMakeMen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值