Day40

今天又去了一家面试,及其不正规,首先通知面试的邮件格式字体大小混乱,强迫症简直不能忍,然后面试题满满4大页也就算了,答题过程中hr不停在旁边巴拉巴拉巴拉的唠闲嗑,还有抽烟的人进进出出,答完题等面试官等了半个多小时,问了几个问题,题也没怎么看,不停看手机,然后就把我打发回来了,就算我不是你们期望的员工也不至于态度这么差吧。。。

anyway,从积极的角度看,还是捞到一道题,回来网上一查大概是来自原来迅雷的一道面试题:

已知一个正整数,求将这个正整数转换为汉字表示,比如1234056表示为一百二十三万四千零五十六。

思路:我在做的时候刚开始没有注意到读法,以为用StringBuilder把数字转为汉字就好了,用了switch穷举,结果switch的写法还写错了( ╯□╰ ),其实用一个0到9的数组穷举就好了,秩都能对的上,还简洁,写了一半才发现把十百千万这些字落下了,之后只能硬着头皮往上补了,用了StringBuilder的Insert函数,结果还用错了,Insert有两个参数,我只填了要插入的string,忘记填位置了ORZ

(而且题目里其实没有任何限制,但是我为了图省事,自作主张将正整数的范围限制在了一万亿以下,这样我只用考虑“万”和“亿”这两个特殊的字了,因为这两个字间分割的各区间段的“十百千”的规律是一样一样的。就这么愉快的决定了。)

括号里的思想大错特错,因为刚刚想起来题目里限制了传入的正整数是int型的,这也就意味着最多最多也就有十位。。。太失败了。。。

最终还是决定参考这位大神的解法记下来:
将数字转换为汉字

string ConvertString(int num)
{
    StringBuilder sb = new StringBuilder();
    if(num / 100000000 != 0)
    {
        sb = ConvertSubString(num / 100000000, sb);
        if(sb.Length != 0)
        {
            sb.Append("亿");
        }
        sb = ConvertSubString(num % 100000000 / 10000, sb);
        num %= 100000000 % 10000 % 1000 % 100 % 10;
    }
    if(num / 10000 != 0)
    {
        sb = ConvertSubString(num / 10000, sb);
        if(sb.Length != 0)
        {
            sb.Append("万");
        }   
        sb = ConvertSubString(num % 10000, sb);
    }
    else
    {
        sb = ConvertSubString(num, sb); 
    )
    return sb.ToString();
}
StringBuilder ConvertSubString(int num, StringBuilder sb)
{
    int[] unitArray = {1000, 100, 10, 1};
    string chineseNum = "零一二三四五六七八九";
    string chineseUnit = "千百十";
    for(int i = 0; i < unitArray.Length && num != 0; i++)
    {
        int p = num / unitArray[i];
        if(p == 0)
        {
            if(sb.Length != 0)
            {
                if(sb[sb.Length - 1] != '零')
                {
                    sb.Append(chineseNum[p]);
                }   
            }
        }
        else
        {
            sb.Append(chineseNum[p]);
            if(i < chineseUnit.Length);
            {
                sb.Append(chineseUnit[i]);
            }
        }
        num %= unitArray[i];
    }
    return sb;
}

你可能感兴趣的:(记忆,string)