《剑指Offer》— Java版(Problem 46 - 50)

Problem 46:把数字翻译成字符串

public int numDecodings(String s){
	if(s == null || s.length() == 0 || s.charAt(0) == '0') return '0';
	int[] dp = new int[s.length()+1];
	dp[0] = 1;
	dp[1] = 1;
	for(int i = 2; i <= s.length(); i++){
		int one = Integer.valueOf(s.subString(i-1, i));
		if(one != 0) dp[i] += dp[i-1];
		
		if(s.charAt(i-2) == '0') continue;
		int two = Integer.valueOf(s.substring(i-2, i));
		if(two <= 26) dp[i] += dp[i-2];
	}
	return dp[s.length()];
}

Problem 47:礼物的最大价值

public int getMost(int[][] values){
	if(values == null || values.length == 0 || values[0].length == 0) return 0;
	int n = value[0].length;
	int[] dp = new int[n];
	for(int[] value : values){
		dp[0] += value[o];
		for(int i = 1; i < n; i++)
			dp[i] = Math.max(dp[i], dp[i-1]) + value[i];
	}
	return dp[n-1];
}

Problem 48:最长不含重复字符的子字符串

public int longestSubStringWithOutDuplcation(String str){
	int curLen = 0. nexLen = 0;
	int[] preIndexs = new int[26];
	Array.fills(preIndexs, -1);
	for(int curI = 0; curI < str.length(); curI++){
		int c = str.charAt(curI) - 'a';
		int preI = preIndexs[c];
		if(preI == -1 || curI -preI > curLen) curLen++;
		else{
			maxLen = Math.max(maxLen, curLen);
			curLen = curI - preI;
		}
		preIndexs[c] = curI;
	}
	MaxLen = Math.max(maxLen, curLen);
	return maxLen;
}

Problem 49:丑数

public int uglyNumber(int n){
	if(n <= 6) return n;
	int[] dp = new int[n];
	int i2 = 0, i3 = 0; i5 = 0;
	dp[0] = 1;
	for(int i = 1; i < n; i++){
		int next2 = dp[i2] * 2, next3 = dp[i3] * 3, next5 = dp[i5] * 5;
		dp[i] = Math.min(Math.min(next2, next3), next5);
		if(dp[i2] == next2) i2++;
		if(dp[i3] == next3) i3++;
		if(dp[i5] == next5) i5++;		 
	}
	return dp[n-1];
}

Problem 50:第一个只出现一次的字符

public int FirstNotRepeat(String str){
	Map<Character, Integer> map = new LinkedHashMap();
	for(int i = 0; i < str.length(); i++){
		if(map.containsKey(str.charAt(i)))
			map.put(str.charAt(i), map.get(str.charAt(i))+1);
		else
			map.put(str.charAt(i), 1);
	}
	for(int i = 0; i < str.length(); i++){
		if(map.get(str.charAt(i)) == 1)
			return map.indexOf(str.charAt(i));
	}
	return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值