转自:http://zhan.renren.com/lichedu?gid=3602888498032799783&from=reblogSynFeed

一道来自亚马逊的笔试题

鉴于目前有不少正在找工作的同学,网上有许多的笔经、面经,但是很少有分享问题解决思路的帖子,笔者不时也会关注这些笔经、面经,愿意和大家分享自己的一些解决思路。由于水平有限,错误在所难免,欢迎批评指正。谢谢!

——小站小编

笔试题

进入正题,下面是一道来自于亚马逊的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) {

 

}

}

--------------我是华丽丽的分隔线----------------

递归简介

首先介绍一下递归。说到递归,大家应该都不陌生。它是编程和问题求解中的一种重要而强大的工具。递归函数就是一种在调用中又调用自身的函数。

递归问题的特征

使用递归技术可以解决的问题应具备以下特征:

1. 该问题包含一个或多个非递归的情况(称为停止情况),这些停止情况的解决方案比较简单直接。

2. 该问题的其他情况可以通过使用递归,从而简化为一个或多个接近于停止情况的子问题。

3. 该问题最终可以简化为多个相对较为容易解决的停止情况。

解决一个递归问题的步骤

1. 尽量简化问题的表述

2. 确定停止情况

3. 确定递归步骤

我们所编写的递归算法通常包含一条如下所示的if语句:

if 满足停止情况

解决该问题

else

使用递归技术将问题分解为更多个简单的子问题

一个简单的例子

 

使用递归求解数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.1 为什么使用递归可以解决问题:

情况A:以019为例,在英语中直接描述。

情况B:以99为例,首先描述90,然后再描述9,进入情况A

情况C999为例,首先描述900,然后再描述99,进入情况B

情况D:以999,999为例,想要用英语描述这个数字,首先需要描述999,000,英语描述999,000时,先描述999,进入情况C,然后加一个thousand;然后再描述999,进入情况C

6.2 使用递归解决问题

第一步,尽量简化问题的表述。用英语描述一个正整数nn属于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)如下:

 
  
  1. private static void printNumber(int num) {  
  2.   
  3. //0-19  
  4.   
  5. switch (num) {  
  6.   
  7. case 0: System.out.print("zero");return;  
  8.   
  9. case 1: System.out.print("one");return;  
  10.   
  11. case 2: System.out.print("two");return;  
  12.   
  13. case 3: System.out.print("three");return;  
  14.   
  15. case 4: System.out.print("four");return;  
  16.   
  17. case 5: System.out.print("five");return;  
  18.   
  19. case 6: System.out.print("six");return;  
  20.   
  21. case 7: System.out.print("senven");return;  
  22.   
  23. case 8: System.out.print("eight");return;  
  24.   
  25. case 9: System.out.print("nine");return;  
  26.   
  27. case 10: System.out.print("ten");return;  
  28.   
  29. case 11: System.out.print("elevent");return;  
  30.   
  31. case 12: System.out.print("twelve");return;  
  32.   
  33. case 13: System.out.print("thirteen");return;  
  34.   
  35. case 14: System.out.print("fourteen");return;  
  36.   
  37. case 15: System.out.print("fifteen");return;  
  38.   
  39. case 16: System.out.print("sixteen");return;  
  40.   
  41. case 17: System.out.print("seventeen");return;  
  42.   
  43. case 18: System.out.print("eighteen");return;  
  44.   
  45. case 19: System.out.print("nighteen");return;  
  46.   
  47. default:;//>=20  
  48.   
  49. }  
  50.   
  51.    
  52.   
  53. //20-99  
  54.   
  55. if (num/10 < 10) {  
  56.   
  57. switch (num/10) {  
  58.   
  59. case 2: System.out.print("twenty");break;  
  60.   
  61. case 3: System.out.print("thirty");break;  
  62.   
  63. case 4: System.out.print("fourty");break;  
  64.   
  65. case 5: System.out.print("fifty");break;  
  66.   
  67. case 6: System.out.print("sixty");break;  
  68.   
  69. case 7: System.out.print("seventy");break;  
  70.   
  71. case 8: System.out.print("eighty");break;  
  72.   
  73. case 9: System.out.print("ninety");break;  
  74.   
  75. defaultbreak;  
  76.   
  77. }  
  78.   
  79.    
  80.   
  81. if (num%10 != 0) {  
  82.   
  83. System.out.print(" "); printNumber(num%10);  
  84.   
  85. }  
  86.   
  87. return;  
  88.   
  89. }  
  90.   
  91.    
  92.   
  93. //100-999  
  94.   
  95. if (num/100 < 10) {  
  96.   
  97. printNumber(num/100);  
  98.   
  99. System.out.print(" hundred");  
  100.   
  101. if (num%100 != 0) {  
  102.   
  103. System.out.print(" and "); printNumber(num%100);   
  104.   
  105. }  
  106.   
  107. return;  
  108.   
  109. }  
  110.   
  111.    
  112.   
  113. //1000-999,999  
  114.   
  115. printNumber(num/1000);  
  116.   
  117. System.out.print(" thousand");  
  118.   
  119. if (num%1000 != 0) {  
  120.   
  121. System.out.print(" "); printNumber(num%1000);  
  122.   
  123. }  
  124.   
  125. return;  
  126.   
  127. }  

最后祝大家都能找到一份自己满意的工作,加油!