转自:http://zhan.renren.com/lichedu?gid=3602888498032799783&from=reblogSynFeed
一道来自亚马逊的笔试题
鉴于目前有不少正在找工作的同学,网上有许多的笔经、面经,但是很少有分享问题解决思路的帖子,笔者不时也会关注这些笔经、面经,愿意和大家分享自己的一些解决思路。由于水平有限,错误在所难免,欢迎批评指正。谢谢!
——小站小编
1 笔试题
进入正题,下面是一道来自于亚马逊的Java编程笔试题,感兴趣的同学可以先自己想想解题思路:
Given an integer between 0 - 999,999, print an English sentence that describes the integer, for example, input 10, the output is ten
Note:
Each word should be lower case, for example, one hundred and twenty, and there should be one and only one space between each word
Samples
input:
1
output:
one
input:
23
output:
twenty three
input:
105
output:
one hundred and five
input:
12345
output:
twelve thousand three hundred and forty five
input:
123456
output:
one hundred and twenty three thousand four hundred and fifty six
Please complement the printNumber method in Solution class:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
int num = Integer.parseInt(br.readLine());
printNumber(num);
isr.close();
br.close();
}
private static void printNumber(int num) {
}
}
--------------我是华丽丽的分隔线----------------
2 递归简介
首先介绍一下递归。说到递归,大家应该都不陌生。它是编程和问题求解中的一种重要而强大的工具。递归函数就是一种在调用中又调用自身的函数。
3 递归问题的特征
使用递归技术可以解决的问题应具备以下特征:
1. 该问题包含一个或多个非递归的情况(称为停止情况),这些停止情况的解决方案比较简单直接。
2. 该问题的其他情况可以通过使用递归,从而简化为一个或多个接近于停止情况的子问题。
3. 该问题最终可以简化为多个相对较为容易解决的停止情况。
4 解决一个递归问题的步骤
1. 尽量简化问题的表述
2. 确定停止情况
3. 确定递归步骤
我们所编写的递归算法通常包含一条如下所示的if语句:
if 满足停止情况
解决该问题
else
使用递归技术将问题分解为更多个简单的子问题
5 一个简单的例子
使用递归求解数n的阶乘,表示为n!
按照解决递归问题的步骤进行:
第一步,尽量简化问题的表述。已经够清楚了。
第二步,确定停止情况。n <= 0。
第三步,递归步骤。return n * factorial(n - 1)
所以最后的实现代码(java)如下:
public static int factorial(int n) {
if (n <= 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
6 回到笔试题
6.1 为什么使用递归可以解决问题:
情况A:以0-19为例,在英语中直接描述。
情况B:以99为例,首先描述90,然后再描述9,进入情况A。
情况C:以999为例,首先描述900,然后再描述99,进入情况B。
情况D:以999,999为例,想要用英语描述这个数字,首先需要描述999,000,英语描述999,000时,先描述999,进入情况C,然后加一个thousand;然后再描述999,进入情况C。
6.2 使用递归解决问题
第一步,尽量简化问题的表述。用英语描述一个正整数n,n属于0 - 999,999。
第二步,确定停止情况。n属于{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}。
第三步,递归步骤。在该问题中需要按n的不同情况来考虑:
n>=20 && n<=99时
n>=100 && n<=999时
n>=1000 && n<=999,999时
所以最后的实现代码(java)如下:
- private static void printNumber(int num) {
- //0-19
- switch (num) {
- case 0: System.out.print("zero");return;
- case 1: System.out.print("one");return;
- case 2: System.out.print("two");return;
- case 3: System.out.print("three");return;
- case 4: System.out.print("four");return;
- case 5: System.out.print("five");return;
- case 6: System.out.print("six");return;
- case 7: System.out.print("senven");return;
- case 8: System.out.print("eight");return;
- case 9: System.out.print("nine");return;
- case 10: System.out.print("ten");return;
- case 11: System.out.print("elevent");return;
- case 12: System.out.print("twelve");return;
- case 13: System.out.print("thirteen");return;
- case 14: System.out.print("fourteen");return;
- case 15: System.out.print("fifteen");return;
- case 16: System.out.print("sixteen");return;
- case 17: System.out.print("seventeen");return;
- case 18: System.out.print("eighteen");return;
- case 19: System.out.print("nighteen");return;
- default:;//>=20
- }
- //20-99
- if (num/10 < 10) {
- switch (num/10) {
- case 2: System.out.print("twenty");break;
- case 3: System.out.print("thirty");break;
- case 4: System.out.print("fourty");break;
- case 5: System.out.print("fifty");break;
- case 6: System.out.print("sixty");break;
- case 7: System.out.print("seventy");break;
- case 8: System.out.print("eighty");break;
- case 9: System.out.print("ninety");break;
- default: break;
- }
- if (num%10 != 0) {
- System.out.print(" "); printNumber(num%10);
- }
- return;
- }
- //100-999
- if (num/100 < 10) {
- printNumber(num/100);
- System.out.print(" hundred");
- if (num%100 != 0) {
- System.out.print(" and "); printNumber(num%100);
- }
- return;
- }
- //1000-999,999
- printNumber(num/1000);
- System.out.print(" thousand");
- if (num%1000 != 0) {
- System.out.print(" "); printNumber(num%1000);
- }
- return;
- }
最后祝大家都能找到一份自己满意的工作,加油!
转载于:https://blog.51cto.com/peopleyou/1047199