本帖最后由 AndroidM 于 2015-7-25 23:54 编辑
最近,刚搞完Android的入学面试,把遇到了一些有价值的面试题分享下吧, :lol
1 , 金额转换,阿拉伯数字转换成中国传统形式。
* 例如:101000001010 转换为 壹仟零壹拾亿零壹仟零壹拾圆整
- public class Test1 {
- public static void main(String[] args) {
- //测试如下
- System.out.println(changeNum("1234"));
- System.out.println(changeNum("12340123"));
- System.out.println(changeNum("90123410011001"));
- System.out.println(changeNum("101000001010"));
- System.out.println(changeNum("90123400001010"));
- //测试异常
- // System.out.println(changeNum("90123400001010A"));
- }
- //完成金额转换方法的定义
- public static String changeNum(String str){
- if(str==null || !str.matches("[0-9]+")){
- throw new RuntimeException("字符串为空或含有非阿拉伯数字");
- }
- String[] num = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
- String[] arr = {"拾","佰","仟","萬","亿"};
- StringBuilder sb = new StringBuilder();
- //处理万位以下数目
- if(str.length()<5){
- for(int i=str.length() - 1; i >=0;i--){
- char c = str.charAt(i);
- int k = Integer.parseInt(c+"");
- if(k==0 || i == str.length() - 1){
- if( k==0 && i==str.length() -1)
- ;
- else
- sb.insert(0, num[k]);
- }else{
- sb.insert(0, num[k]+arr[str.length() - i -2]);
- }
- }
- }
- else{
- //处理亿位以下数目,通过递归 分别处理 万位 及万位以下数据
- if(str.length() < 9){
- int k = str.length() - 4;
- String f = changeNum(str.substring(0,k));
- if(f.equals("零")||f.equals("零圆整"))
- sb.append(f+changeNum(str.substring(k,str.length())));
- else
- sb.append(f+arr[3]+changeNum(str.substring(k,str.length())));
- }else{
- if(str.length() > 8){
- int k = str.length() - 8;
- sb.append(changeNum(str.substring(0,k))+arr[4]+changeNum(str.substring(k,str.length())));
- }
- }
- }
- //处理字符串中的多零情况,并返回
- return sb.toString().replaceAll("[零]+", "零").replaceAll("[圆整]", "")+"圆整";
- }
- }
复制代码 输出答案:
- 壹仟贰佰叁拾肆圆整
- 壹仟贰佰叁拾肆萬零壹佰贰拾叁圆整
- 玖拾萬壹仟贰佰叁拾肆亿壹仟零壹萬壹仟零壹圆整
- 壹仟零壹拾亿零壹仟零壹拾圆整
- 玖拾萬壹仟贰佰叁拾肆亿零壹仟零壹拾圆整
复制代码
2、编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数,然后打印出这个十进制整数对应的二进制形式。这个程序要考虑输入的字符串不能转换成一个十进制整数的情况,并对转换失败的原因要区分出是数字太大,还是其中包含有非数字字符的情况。
提示:十进制数转二进制数的方式是用这个数除以2,余数就是二进制数的最低位,接着再用得到的商作为被除数去除以2 ,这次得到的余数就是次低位,如此循环,直到被除数为0为止。其实,只要明白了打印出一个十进制数的每一位的方式(不断除以10,得到的余数就分别是个位,十位,百位),就很容易理解十进制数转二进制数的这种方式。
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- public class Test2 {
- public static void main(String[] args) throws IOException {
- System.out.println(Integer.MAX_VALUE);
- System.out.println(Integer.MIN_VALUE);
- BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- String line = in.readLine();
- if(checkDigital(line))
- throw new RuntimeException("转换错误,含有非数字字符");
- try{
- int value = Integer.parseInt(line);
- String binary = toBinary(value);
- System.out.println("right : :" + Integer.toBinaryString(value));
- System.out.println("my result :"+binary);
- }catch (Exception e) {
- throw new RuntimeException("转换错误,数字过大");
- }
- }
- private static String toBinary(int value) {
- StringBuilder sb = new StringBuilder();
- int y = 0;
- while(value != 0 ){
- y = value % 2;
- value = value/2;
- sb.insert(0, y);
- }
- return sb.toString();
- }
- private static boolean checkDigital(String line) {
- char[] cs = line.toCharArray();
- for(char c : cs){
- if(!Character.isDigit(c)){
- return true;
- }
- }
- return false;
- }
- }
复制代码
3、 方法中的内部类能不能访问方法中的局部变量,为什么?
(这道题可能很多人都和我一样,只知其然,而不知道其所以然, 推荐 看这个帖子,讲的非常好:http://www.cnblogs.com/dolphin0520/p/3811445.html)
答: 可以訪問, 但是必須是用final修飾的局部变量, 因為在內部類中使用的局部變量是外部方法內變量的一個拷貝,
是編譯器在創建內部類時自動傳給內部類的,為了防止內部類中變量與方法中變量出現數據不一致的情況,所以使用
的变量必須要用final修飾。
4、 编写程序,生成5个1至10之间的随机整数,存入一个List集合,
* 编写方法对List集合进行排序(自定义排序算法,禁用Collections.sort方法和TreeSet),然后遍历集合输出。
- public class Test4 {
- public static void main(String[] args) throws IOException {
- List<Integer> list = new ArrayList<Integer>();
- for(int i=0; i<5; i++)
- list.add(new Random().nextInt(10));
- System.out.println(list);
- //sortMaopao(list);
- //sortChoose(list);
- sortInsert(list);
- }
- }
- //插入排序
- private void sortInsert(List<Integer> list) {
- for(int i=1; i<list.size(); i++){
- int j;
- int temp = list.get(i);
- for( j=i; j>0&& temp <list.get(j-1) ; j--){
- list.set(j, list.get(j-1));
- }
- list.set(j, temp);
- }
- System.out.println(list);
- }
- //选择排序
- private void sortChoose(List<Integer> list) {
- for(int i=0; i<list.size(); i++){
- for(int j=i+1; j<list.size(); j++){
- if(list.get(i)>list.get(j)){
- int temp = list.get(i);
- list.set(i, list.get(j));
- list.set(j, temp);
- }
- }
- }
- System.out.println(list);
- }
- //冒泡排序
- private void sortMaopao(List<Integer> list) {
- for(int i=1; i<list.size(); i++){
- for(int j=0; j<list.size()-i; j++){
- if(list.get(j)>list.get(j+1)){
- int temp = list.get(j);
- list.set(j, list.get(j+1));
- list.set(j+1, temp);
- }
- }
- }
- System.out.println(list);
- }
- }
复制代码
|
|