1. 程式人生 > 其它 >java —— 笨小猴

java —— 笨小猴

技術標籤:java

java —— 笨小猴

題目詳情

笨小猴的詞彙量很小,所以每次做英語選擇題的時候都很頭疼。但是他找到了一種方法,經試驗證明,用這種方法去選擇選項的時候選

對的機率非常大!這種方法的具體描述如下:

假設maxn是單詞中出現次數最多的字母的出現次數,minn是單詞中出現次數最少的字母的出現次數,如果maxn-minn是一個質數,那

麼笨小猴就認為這是個Lucky Word,這樣的單詞很可能就是正確的答案。

輸入格式:

| 輸入只有一行,是一個單詞,其中只可能出現小寫字母,並且長度小於100。 |

輸出格式:

| 輸出共兩行,第一行是一個字串,假設輸入的的單詞是Lucky Word,那麼輸出“Lucky Word”,否則輸出“No Answer”; 第二行是一個整數,如果輸入單詞是Lucky Word,輸出maxn-minn的值,否則輸出0。 |

程式碼如下:

方法一:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine(); // 從鍵盤輸入一個字串
        char[] ch = str.toCharArray(); // 把字串轉換為字元陣列
        int[] a = new int[100]; // 因為最多有100個字母,用於儲存str中每個位置字母的個數
        int maxn = 0, minn = 100; // 因為當100字母都是相同的則最小就為100
        for (int i = 0; i < ch.length; i ++){//找出每個位置字母在整個字串中相同字母的個數
            int num = 0;
            for (int j = 0; j < ch.length; j ++){
                if (ch[j] == ch[i]){
                    num ++;
                }
            }
            a[i] = num;
        }
        for (int i = 0; i < ch.length; i ++){ // 根據比較大小來判斷陣列a中誰最大誰最小
            if (maxn < a[i]){
                maxn = a[i];
            }
            if (minn > a[i]){
                minn = a[i];
            }
        }
        if (Prime(maxn , minn) == true){
            System.out.println("Lucky Word");
            System.out.println(maxn - minn);
        } else {
            System.out.println("No Answer");
            System.out.println("0");
        }
    }
    public static boolean Prime(int a, int b){ // 自定義一個方法判斷是不是質數
        if (a - b < 2)
            return false; // 利用Math.sqrt(double)將a-b強制轉換為duoble型
        for (int i = 2; i <= Math.sqrt((double) (a - b)); i ++){
            if ((a - b) % i == 0){
                return false;
            }
        }
        return true;
    }
}

方法二:(提供者:Jplusztx)


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        String str = stdIn.next(); // 從鍵盤輸入字串
        int[] letters = new int[26];//因為只有26個字母,所以開闢大小為26的空間
        int maxIndex = 0, minIndex = 0;
        for (int i = 0; i < str.length(); i++) { // .length() 獲取字串長度
            int index = str.charAt(i) - 'a'; // 獲取str字串指定處i的字元,並減掉 'a',得到的數範圍是[0,25]
            letters[index]++; //  
            if (letters[index] > letters[maxIndex])
                maxIndex = index;
            //字母必須是在單詞中出現過,才能被記錄,所以此處加上letters[index] == 0條件
            if (letters[minIndex] == 0 || letters[index] < letters[minIndex])
                minIndex = index;
        }
        if (isPrime(letters[maxIndex] - letters[minIndex])){
            System.out.println("Lucky Word");
            System.out.println(letters[maxIndex] - letters[minIndex]);
        }else {
            System.out.println("No Answer");
            System.out.println(0);
        }
    }
    public static boolean isPrime(int n){ // 判斷是不是質數
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) return false;
        }
        return n > 1; // return n > 1返回值是boolean值,同時考慮了 n = 0 或 1 的情況
    }
}
 int index = str.charAt(i) - 'a'; // 獲取str字串指定處i的字元,並減掉 'a',得到的數範圍是[0,25]
            letters[index]++; 

此處利用了 字串名.charAt() 獲取字串指定位置的字母,並且此處全為小寫字母,因此減去 ’ a ’ 會得到一個0~25之間的數,從而letter[index] 再進行累加,比如letters[0]就代表a出現的次數,所以我們只用統計陣列letter 的下標就可以間接的統計某一個字母出現的次數。

字串名.charAt(): 返回指定處的字元。