笔试题笔记——阿里

最近近做了阿里的笔试题,将数字转成中文进行朗读,数字较小时直接朗读,而当数字较大时,我们希望朗读的更人性化一点,会在中间稍微停顿。

注意:数字不会超过万亿。

通过中文逗号来表达一个停顿,根据朗读习惯,一次朗读的中文数字最好不要大于8个字,否则就建议增加一个停顿。


解题思路:

第一步、先不考虑加逗号,直接把阿拉伯数字转换成中文数字。这很简单。

第二步、转换完成后,发现根据中文数字的朗读习惯,有些零可以去掉,则去掉多余的零。

第三步、最后考虑特殊的情况,一十,一十万,一十亿在中文数字里不读前面的一。

接下来直接上代码:

import java.util.Scanner;

/**
 * 18-4-11
 * @author hsy
 *
 */
public class Alibaba1 {
	 public static void main(String[] args){
	        Scanner in = new Scanner(System.in);
	        String res;
	        String input = in.nextLine().trim();

	        String[] s ={"","十","百","千"};
	        String[] w = {"零","一","二","三","四","五","六","七","八","九"};
	        String[] v = {"个","万","亿","万亿"};
	        int index = 0;
	        String[] resStr = new String[3];
	        String tran = "";
	        for(int i=input.length()-1;i>=0;i--){
	        	int p = input.length()-i-1;
	        	String x = input.substring(p,p+1);
	        	int m = Integer.parseInt(x);
	        	tran += w[m];
	        	
	        	//i 不在个位
	        	if(i%4!=0 && m!=0)
	        		tran += s[i%4];//百千
	        	
	        	if(i%4==0)
	        	tran+= v[i/4];//万亿
	        	index++;
	        }
//	        System.out.println(tran);
	        StringBuilder sb=new StringBuilder(tran);
        
	        if(tran.contains("零") ){
	        	//个,万,亿前面的零删掉
	        	for(int i=sb.length()-1;i>=1;i--){    
	        		char a = sb.charAt(i);
	        		char b = sb.charAt(i-1);
//	        		char c = sb.charAt(i-2);
	        		//个,万,亿前面的零删掉
	        		if(a=='个'||a=='万'||a=='亿'){
	        			
	        			if(b=='零'){
		        			sb.delete(i-1, i);		        			        			
		        		}
	        		}        	
	        	}
	        	//剩下相邻的零也删掉
	        	for(int i=sb.length()-1;i>=1;i--){    
	        		
	        		char a = sb.charAt(i);
	        		char b = sb.charAt(i-1);
	        		
	        		if(a=='零' && b=='零'){
	        			sb.delete(i-1, i+1);
	        			break;
	        		}	        	
	        	}
	        }
	        //去掉个
	        sb.deleteCharAt(sb.length()-1);
	        //判断开头是不是一十,如果是改成十
	        if(sb.charAt(0)=='一' && sb.charAt(1)=='十')
	        	sb.deleteCharAt(0);
	        
	        System.out.println(sb.toString());
	        
	        //中文数字小于8,直接读,大于8,得用括号分开
	        if(sb.length()<=8)
	        	
	        	System.out.println(sb.toString());       
	        else{
	        	
	        	 StringBuilder newSb =new StringBuilder();
	        	 
	        	for(int i=0;i<sb.length();i++){
	        		char c = sb.charAt(i);
	        		newSb.append(c);
	        		//亿、万,断开        	
        			if(c=='亿'||c=='万')
        				
	        			newSb.append(',');     		        			        	
	        	}
	        	String[] str = newSb.toString().split(",");
	        	//如果万,个 加起来不超过8,则不打逗号
	        	if(str[1].length()+str[2].length()<=8)
	        		System.out.println(str[0]+","+str[1]+str[2]);
	        	//否则全打逗号
	        	else
	        		System.out.println(newSb.toString());
	        }	        	
	    }	
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值