就職の面接問題(2)

1574 ワード

やはりあの問題、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)*1つの10のN次方で、等しいのはそのビットの前の数字*10のN次方+そのビットの後ろの数字+1で、より小さいのはそのビットの前の数字*10のN次方です
すべての累積が結果です...
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ