華爲:貨幣匯率機試題

///其實是修改的別人的代碼,代碼不分家,共享靠大家,留作以後複習參考。

import java.util.Scanner;

///題目是  1英鎊=2美元=16人民幣=32港元
///MAX爲最大兌換,意思是所有貨幣都要用到
///MIN爲最小兌換,意思是隻需要港元爲單位即可

///這道題看透了其實就是一道求單位的題,只需要用到除法!!!!!!!!

///輸入: 2 8 2 127 HKD MAX
/// 第一個參數代表英鎊兌美元的匯率,第二個參數代表美元兌人民幣的匯率,第三個參數代表人民幣對港元的匯率
///英鎊>美元>人民幣>港元
///輸出:3 GBP 1 USD 7 CNY 1 HKD
///3*32+1*16+7*2+1 = 127
public class Main
{
 

    public static class SolutionWay
    {
 
        private static final String GBP = "GBP";///英鎊
        private static final String USD = "USD";///美元
        private static final String CNY = "CNY";///人民幣
        private static final String HKD = "HKD";///港元
        private static final String MAX = "MAX";///最大兌換
        private static final String MIN = "MIN";///最小兌換
        private static final String ERROR = "ERROR";
 

        private static int gbpRate;
        private static int usdRate;
        private static int cnyRate;
 
        private static int inputNum;
        private static String inputType;
        private static String resultType;
 
        ///設置匯率係數
        private static void setParam(int a, int b, int c, int num, String inputT, String resultT)
        {
            gbpRate = a * b * c;
            usdRate = a * b;
            cnyRate = a;
            inputNum = num;
            inputType = inputT;
            resultType = resultT;
        }
 
        private static int getRate(String type)
        {
            switch (type)
            {
                case GBP:
                    return gbpRate;
                case USD:
                    return usdRate;
                case CNY:
                    return cnyRate;
                default:///港元
                    return 1;
 
            }
        }
 
 
        private static boolean checkNum(String num)///檢查輸入是否爲負數,或小數
        {
            for (int i = 0; i < num.length(); i++)
            {
                char c = num.charAt(i);
                if (c < '0' || c > '9')
                {
                    return false;
                }
            }
            return true;
        }
 
 
        private static boolean checkType(String type)///檢查貨幣類型是否爲以下四種之一,主要是檢查是否爲大寫
        {
 
            return type.equals(HKD) || type.equals(CNY) || type.equals(USD) || type.equals(GBP);
        }
 ///輸入的所有參數都要進行檢查
        private static boolean checkResultType(String resultType)///檢查是否爲MAX或MIN
        {
            return resultType.equals(MAX) || resultType.equals(MIN);
        }
 

        private static String getMaxResult()
        {
            int tempV = getRate(inputType) * inputNum;///貨幣轉換成以港元爲單位
            StringBuilder result = new StringBuilder();
            if (tempV / gbpRate > 0)
            {
                result.append(tempV / gbpRate).append(' ').append("GBP ");
                tempV = tempV % getRate(GBP);
            }
            if (tempV / usdRate > 0)
            {
                result.append(tempV / usdRate).append(' ').append("USD ");
                tempV = tempV % getRate(USD);
            }
            if (tempV / cnyRate > 0)
            {
                result.append(tempV / cnyRate).append(' ').append("CNY ");
                tempV = tempV % getRate(CNY);
            }
            if (tempV > 0)
            {
                result.append(tempV).append(' ').append("HKD");
            }
            return result.toString();
        }
 

        private static String getMinResult()
        {
            return inputNum * getRate(inputType) + " HKD";
        }
 
 
        private static String computer(String input)
        {
            String[] strArr = input.split("\\s");///以空白字符分割字符串,得到一個字符串數組。
            /*
            1、\s用於匹配空白字符。
            2、\\s用於匹配字符串中的\和s,兩個字符。
            */
            if (strArr.length == 6 && (checkNum(strArr[0]) && checkNum(strArr[1]) && checkNum(strArr[2]) && checkNum(strArr[3]) && checkType(strArr[4]) && checkResultType(strArr[5])))
            {
                setParam(Integer.parseInt(strArr[0]), Integer.parseInt(strArr[1]), Integer.parseInt(strArr[2]), Integer.parseInt(strArr[3]), strArr[4], strArr[5]);
 
                if (resultType.equals(MAX))
                {
                    return getMaxResult();///最大兌換
                } else
                {
                    return getMinResult();
                }
            } else
            {
                return ERROR;
            }
 
        }
    }
 
 
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        String s1 = in.nextLine();
 
        System.out.println(SolutionWay.computer(s1));
    }
}
/*
 一些基礎總結
  1、 String類是不可變類,即一旦一個String對象被創建以後,包含在這個對象中的字符序列是不可改變的,直至這個對象被銷燬。
  2、 StringBuffer對象則代表一個字符序列可變的字符串,當一個StringBuffer被創建以後,通過
     StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()
               等方法可以改變這個字符串對象的字符序列。一旦通過StringBuffer生成了最終想要的字符串,
               就可以調用它的toString()方法將其轉換爲一個String對象。
  3、StringBuilder類也代表可變字符串對象。實際上,StringBuilder和StringBuffer基本相似,
              兩個類的構造器和方法也基本相同。不同的是:StringBuffer是線程安全的,而StringBuilder則沒有實現線程安全功能,所以性能略高。
    StringBuffer類中的方法都添加了synchronized關鍵字,也就是給這個方法添加了一個鎖,用來保證線程安全。
 */

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章