京東2019春招Java工程師編程題題解


生成回文串

題目描述

對於一個字符串,從前開始讀和從后開始讀是一樣的,我們就稱這個字符串是回文串。

例如"ABCBA","AA","A"是回文串,而"ABCD","AAB"不是回文串。

牛牛特別喜歡回文串,他手中有一個字符串s,牛牛在思考能否從字符串中移除部分(0個或多個)字符使其變為回文串,並且牛牛認 為空串不是回文串。

牛牛發現移除的方案可能有很多種,希望你來幫他計算一下一共有多少種移除方案可以使s變為回文串,對於兩種移除方案如果移除的字符依次構成的序列不一樣就是不同的方法。

輸入描述

輸入包括一個字符串s(1 <= iength(s) <= 50),s中只包含大寫字母。

輸出描述

對於每個測試用例,輸出一個正整數表示方案數。

思路

dp[l][r]表示區間 [l, r] 內的回文串數目。於是dp[l][r] = dp[l][r - 1] + dp[l + 1][r],根據s[l] 是否等於 s[r], 來看是+1還是減掉重復的部分。

代碼實現

package jingdong.demo1;

import java.util.Scanner;

/**
 * 生成回文串
 */
public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int len = s.length();
        int[][] dp = new int[len + 1][len + 1];
        for (int i = 0; i <= len; i++)
            dp[i][i] = 1;
        for (int i = 2; i <= len; i++) {
            for (int l = 1; l <= len - i + 1; l++) {
                int r = l + i - 1;
                dp[l][r] += dp[l + 1][r];
                dp[l][r] += dp[l][r - 1];
                if (s.charAt(l - 1) == s.charAt(r - 1))
                    dp[l][r] += 1;
                else
                    dp[l][r] -= dp[l + 1][r - 1];
            }
        }
        System.out.println(dp[1][len]);
    }
}

整數分解

題目描述

小Q的數學老師給了小Q一個整數N,問小Q能否將W分解為兩個整數X和Y相乘,並且滿足X為奇數,Y為偶數,即能否找到奇數X和偶數Y滿足X * Y = N,小Q被這個問題難住了,希望能你來幫助他計算。

輸入描述:

輸入的第一行包含一個正整數t( 1<= t <= 1000 ),表示測試樣例數。接下來的t行,每行一個正整數N (2 <= N < 2^63),表示給出的N。保證不是2的冪次。

輸出描述:

如果能找到這樣的X,Y,則依次輸出X,Y,如果有多解輸出Y最小的那組解,以空格分割,否則輸出"No"。

示例1

輸入

2

10

5

輸出

5 2

No

思路

先判斷N是不是奇數,是的話直接返回No,然后Y從2開始,每次乘2,判斷X是不是奇數。

代碼實現

package jingdong.demo2;

import java.util.Scanner;

/**
 * 整數分解
 * 先判斷N是不是奇數,是的話直接返回No
 * 然后Y從2開始,每次加2,判斷X是不是奇數
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        long[] arr = new long[t];
        for (int i = 0; i < t; i++) {
            arr[i] = sc.nextLong();
        }
        for (long N : arr) {
            if (N % 2 != 0) {
                System.out.println("No");
                break;
            }
            long X;
            long Y;
            for (int i = 1; i <= N / 2; i++) {
                Y = i * 2;
                if (N % Y == 0) {
                    X = N / Y;
                    if (X % 2 != 0) {
                        System.out.println(X + " " + Y);
                        break;
                    }
                }
            }
        }
    }
}

牛牛的括號匹配

題目記不清了,和HDU 5831差不多。

思路

用一個計數量 cnt 統計左括號數量就行,匹配到右括號,就另 cnt--,如果 cnt < 0 就認為不匹配。其次,如果左括號數不等於右括號數,可以直接認為不匹配,不進行計算。

代碼實現

package jingdong.demo3;


import java.util.*;

/**
 * 牛牛的括號匹配
 */
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        while (N-- > 0) {
            String s = in.next();
            char[] chars = s.toCharArray();
            System.out.println(check(chars) ? "Yes" : "No");
        }
    }

    private static boolean check(char[] chars) {
        int lCnt = 0, rCnt = 0;
        for (char c : chars) {
            if (c == '(') lCnt++;
            else rCnt++;
        }
        if (lCnt != rCnt) return false;
        for (int i = 1; i < chars.length; i++) {
            for (int j = 0; j < i; j++) {
                swap(chars, i, j);
                if (isPalindrome(chars)) return true;
                swap(chars, i, j);
            }
        }
        return false;
    }

    private static boolean isPalindrome(char[] chars) {
        int cnt = 0;
        for (char c : chars) {
            if (c == '(') cnt++;
            else {
                if (cnt <= 0) return false;
                cnt--;
            }
        }
        return cnt == 0;
    }

    private static void swap(char[] chars, int i, int j) {
        char t = chars[i];
        chars[i] = chars[j];
        chars[j] = t;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM