題目描述

假設有個字串S和其反轉之後的字串R。如果S字串中的每個字元和其前一個字元的字元值之差的絕對值都與字串R中對應相同索引值的字元和其前一個字元的字元值之差的絕對值是相等的,我們可以說這個字串S是個「有趣的」字串。



原題網址

https://www.hackerrank.com/challenges/funny-string/

輸入格式

第一行為一個整數T,表示有幾組測試資料,範圍在1到10之間(包含1和10)。接下來的T行,每行都是一個要測試的字串,長度在2到10000之間(包含2和10000)。

輸出格式

分行輸出每組輸入字串測試的結果。如果是「有趣的」字串,輸出「Funny」;如果不是「有趣的」字串,輸出「Not Funny」。

範例輸入

2
acxz
bcxz

範例輸出

Funny
Not Funny

額外解釋

「acxz」的反轉字串是「zxca」,從第二個(索引1)字元開始看,「c」和「a」差2,「x」和「z」差2。再看第三個字元,「x」和「c」差21,「c」和「x」差21。再看第四個字元,「z」和「x」差2,「c」和「a」差2。所以「acxz」是「有趣的」字串。

「bcxz」的反轉字串是「zxcb」,從第二個(索引1)字元開始看,「c」和「b」差1,「x」和「z」差2。所以「bcxz」不是「有趣的」字串。

解題概念

讀入字串S之後,使用迴圈去計算從頭開始和從尾開始兩兩字元值之差的絕對值。如果發現絕對值不相等,就直接輸出「Not Funny」;如果一直到迴圈結束都沒發現不相等的絕對值,輸出「Funny」。

參考答案

import java.util.Scanner;

public class Solution {

    public static void main(final String[] args) {
        final Scanner sc = new Scanner(System.in);

        int t = Integer.parseInt(sc.nextLine());
        while (t-- > 0) {
            final char[] s = sc.nextLine().toCharArray();
            final int length_dec = s.length - 1;
            boolean funny = true;
            for (int i = 0; i < length_dec; ++i) {
                final int a = Math.abs(s[i] - s[i + 1]);
                final int b = Math.abs(s[length_dec - i] - s[length_dec - i - 1]);
                if(a != b){
                    funny = false;
                    break;
                }
            }
            System.out.println(funny ? "Funny" : "Not Funny");
        }
    }
}