找工作之面试题(1)

方法1:

一个很笨的方法,时间复杂度比较高,具体是多少= =我也说不清,感觉是O(n^2)级别的。。。(如果不对请帮忙指出)

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

public class Test {
	public static void main(String[] args) {
		int num = 1999;
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i <= num; i++) {
			int temp = i;
			while (temp / 10 != 0) {
				list.add(temp % 10);
				temp /= 10;
			}
			list.add(temp);
		}

		int count = 0;
		for (Integer i : list) {
			if (i == 1) {
				count++;
			}
		}

		System.out.println(count);

	}

}


方法2:

折腾一晚上想出来的一个办法,采用递归方式,找规律,从最高位着手,考虑不同情况吧。。。这个算法效率应该是上去了,不再需要各种遍历之类的了= =,应该是小于O(n)吧。。。

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		int num = new Scanner(System.in).nextInt();
		System.out.println(func(num));
	}
	/**
	 * 递归调用方法
	 * 思路是从最高位开始判断
	 * 如果大于1,则包含该位的所有1,然后根据倍数关系求出数量
	 * 如果小于等于1,则出现除了该位的剩下数字+1次
	 * @param num
	 * @return
	 */
	private static int func(int num) {
		if (num < 10)
			return 1;
		int max = getMax(num);
		int rest = num - max * getN0(num);
		int result = 0;
		if (max > 1) {
			result = 1 * getN0(num);
		} else {
			result = rest + 1;
		}
		return result + func(1 * getN0(num) - 1) * (max + 1);
	}

	/**
	 * 举例:给234返回100,给1234返回1000,给定99返回10
	 * @param num
	 * @return
	 */
	private static int getN0(int num) {
		int len = ("" + num).length();
		int result = 1;
		for (int i = 1; i < len; i++) {
			result *= 10;
		}
		return result;
	}
	/**
	 * 求一个数字的最高位是几
	 * @param num
	 * @return
	 */
	private static int getMax(int num) {
		while (num / 10 != 0) {
			num /= 10;
		}
		return num;
	}

}


你可能感兴趣的:(算法,递归,计算1)