2016华为笔试题——整数之循环节点求和

今天刚考完华为的笔试,总体来说还不难,只要你刷过一些题。但是,笔试之后的心理测试,却让我失去这次面试机会,有点小小的不甘!好啦,废话不多说,进入正题吧!

(1) 题目

整数之循环节点求和
描述: 
任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时在前面补零,类推下去,最后将变成一个固定的数:6174。
例如:4321-1234=3087   8730-378=8352   8532-2358=6174   7641-1467=6147。  
如果K位数也照此办理,它们不是变成一个数,而是在几个数字之间形成循环,例如对于五位数5432154321-12345=41976  97641-14679=82962   98622-22689=75933     97533-33579=63954   96543-34569=61974   97641-14679=82962    
我们把82962  75933  63954  61974称作循环节。在前面6174中,循环节认为只有一个数。
请输出这些循环节之和,最终结果可能需要使用64位的整型才能存放。当没有循环节,输出0,例如:输入33333,输出0。
运行时间限制: 无限制
内存限制:   无限制
输入: 
输入为一个正整数,取值范围位0~0xffffffff
输出: 
输出为各循环节的和
样例输入:   
3214
样例输出:   
6174

(2) 我的思路
首先一定要把题意理解清楚,否则,全部都是无用功。
首先,对于一个整数,我们需要获取由这个整数所包含的数字能组成的最大整数和最小整数,这是第一步。第二步判断当前得到的差是否在前面已经出现过。如果出现过,那么从这个数上一次出现的位置开始,到目前这个数字的前一个就是循环节了。最后将循环节相加就Ok了。

(3) 我的实现

package com.liu;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main3
{
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext())
        {
            long input = Long.parseLong(scanner.nextLine());

            long maxNum = getMaxNum(input);         
            long minNum = getMinNum(input);

            ArrayList<Long> resultList = new ArrayList<>();

            long result = maxNum-minNum;        

            int index = 0;

            //当检测到出现循环节时跳出循环
            while(!resultList.contains(result))
            {
                resultList.add(index,result);

                //计算最大最小以及差
                maxNum = getMaxNum(result);
                minNum = getMinNum(result);

                result = maxNum-minNum;

                index++;            
            }       

            int Inindex = 0;            
            for(int k=0; k<resultList.size(); k++)
            {
                if(resultList.get(k) == result)
                {
                    break;
                }
                Inindex++;              
            }

            long sum = 0;

            for(int j=Inindex; j<resultList.size(); j++)
            {               
                sum += resultList.get(j);
            }

            System.out.println(sum);
        }
    }



    //计算相应最大整数
    public static Long getMaxNum(long input2)
    {
        char[] input = (input2+"").toString().toCharArray();

        Arrays.sort(input);

        String inputString = "";        
        for(int i=0; i<input.length; i++)
        {
            inputString += input[i];
        }

        StringBuffer st = new StringBuffer(inputString);

        String reverssString = st.reverse().toString();

        return Long.parseLong(reverssString);
    }   

    //计算相应最小整数  
    public static long getMinNum(long input2)
    {
        char[] input = (input2+"").toString().toCharArray();

        Arrays.sort(input);

        String inputString = "";        
        for(int i=0; i<input.length; i++)
        {
            inputString += input[i];
        }   
        return Long.parseLong(inputString);         
    }

}

提醒:注意题目中的“最终结果可能需要使用64位的整型才能存放”这句话,要将最大整数、最小整数以及结果定义成long类型,否则可能因为无法表示而报错。

(4) 总结
这题总体来说难度不是很大,思路也比较容易想到。只是我这种解法可能不够简洁和高效,请有更好解法的大神不吝赐教。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值