找工作之面试题(2)

还是那道题,计算从1-某个数,出现多少次某个数

优化过的代码如下

package mianshiti;

import java.util.ArrayList;
import java.util.List;

public class Main2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(calc(6282, 3));
	}
	
	
	public static int calc(int num,int target){
		int result=0;
		for (int i = 0; i <String.valueOf(num).length(); i++) {
			int n = getIndexNum(num, i);
			if(n>target)
				result+=getNum(String.valueOf(num).length()-1-i)*(getTop(num,i)+1);
			else if(n==target){
				result+=getNum(String.valueOf(num).length()-1-i)*(getTop(num,i))+(rest(num,i+1)+1);
			}else
				result+=getNum(String.valueOf(num).length()-1-i)*(getTop(num,i));
				
		}
		return result;
	}
	private static int rest(int num, int i) {
		return Integer.parseInt(String.valueOf(num).substring(i).equals("")?"0":String.valueOf(num).substring(i));
	}
	private static int getTop(int num, int i) {
		if(i<1)
			return 0;
		return Integer.parseInt((String) String.valueOf(num).subSequence(0, i));
	}
	private static int getIndexNum(int num,int index){
		return String.valueOf(num).charAt(index)-'0'; 
	}
	private static int getNum(int num){
		int result=1;
		for (int i = 0; i < num; i++) {
			result*=10;
		}
		return result; 
	}
	
	
}

想了很久还是觉得用循环容易一些。

思路呢也很简单,从最高位开始,逐次判断,是否大于目标数字,大于,则是(该位之前的数字+1)*一个10的N次方,相等则是该位之前的数字*10的N次方+该位后面的数字+1,小于则是该位之前的数字*10的N次方

所有的累加起来就是结果。。。

呼呼呼,搞定~~~睡觉~

你可能感兴趣的:(找工作之面试题(2))