ブルーブリッジカップ試験の基本演習完璧な価格BASIC-19 JAVAとPython

序文

私は最近インタビューを行っています。書かれたコードの多くは、ブログに投稿するのが面倒なので、現在は記入されていますが、コメントが少ない場合があります。ご不明な点がございましたら、お問い合わせください

練習問題の基本的な費用

リソース制限
時間制限:1.0秒メモリ制限:512.0MB

問題の説明
  回文は特殊なタイプの文字列で、左から右へ、右から左へと読むのと同じです。小龍龍は回文は完璧だと信じています。文字列を与えます。これは必ずしも回文ではありません。文字列が完全な回文文字列になるように、最小交換回数を計算してください。
  交換の定義は次のとおりです。隣接する2つの文字を   交換します
  たとえば、mamadは
初めて広告交換します。ad
  2回目はmamda
  交換します。md:3回目はmadma 交換します。ma :madam

入力形式
  最初の行は整数Nで、次の文字列の長さを示します(N <= 8000)
  2番目の行は文字列で、長さはNです。小文字のみが含まれます

出力フォーマット
  可能であれば、最小数の交換を出力します。
  そうでなければ出力不可能

サンプル入力
5
mamad

出力例
3

この質問のコード(JAVA)

import java.util.Scanner;

public class ThePriceOfPerfection3 {
    private static int count = 0;
    private static boolean haveMiddle = false;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        String str = sc.next();
        char[] charArr = str.toCharArray();//将输入字符串转换为char数组
        if (palindrome(charArr, 0, N - 1)) {
            System.out.println(count);
        } else {
            System.out.println("Impossible");
        }
    }

    private static boolean palindrome(char[] charArr, int a, int b) {
        if (b <= a) {
            return true;
        }
        // 从最后的位置开始遍历字符串
        for (int i = b; i > a; i--) {
            if (charArr[a] == charArr[i]) {
                exchangeTo(charArr, i, b);
                count += b - i;
                return palindrome(charArr, a + 1, b - 1);
            }
        }
        // 如果没有出现过中间字符
        if (!haveMiddle) {
            haveMiddle = true;
            count += charArr.length / 2 - a;
            return palindrome(charArr, a + 1, b);
        }
        return false;
    }

    private static void exchangeTo(char[] charArr, int a, int b) {
        //字符交换方法1
        for (int i = a; i < b; i++) {
            char tmp = charArr[i];
            charArr[i] = charArr[i + 1];
            charArr[i + 1] = tmp;
        }
        /*交换字母方法2
        char temp = charArr[a];
        for (int i = a; i < b; i++) {
            charArr[i] = charArr[i + 1];
        }
        // if (b - a >= 0) System.arraycopy(charArr, a + 1, charArr, a, b - a);
        charArr[b] = temp;*/
    }
}

この質問のコード(Python)

def move(l, a, b):
    buf = l[a]
    if b > a:
        l[a:b] = l[a + 1:b + 1]
    else:
        l[b + 1:a + 1] = l[b:a]
    l[b] = buf


n = eval(input())
s = input()
cl = []
side = []
for c in s:
    have = False
    for i in range(len(cl)):
        if cl[i] == c:
            side.append(c)
            del cl[i]
            have = True
            break
    if not have:
        cl.append(c)
if len(cl) > 1:
    print("Impossible")
else:
    s = list(s)
    num = 0
    mid = False
    for i in range(int(n / 2)):
        if mid:
            move(s, n - 1 - i, n - 2 - i)
            num += 1
        if s[i] != s[n - 1 - i]:
            omid = True
            for j in range(i + 1, n - i - 1):
                if s[j] == s[n - 1 - i]:
                    omid = False
                    move(s, j, i)
                    num += j - i
                    break
            if omid and not mid:
                mid = True
                move(s, n - 1 - i, n - 2 - i)
                num += 1
                for j in range(i + 1, n - i - 1):
                    if s[j] == s[n - 1 - i]:
                        move(s, j, i)
                        num += j - i
                        break
    print(num)

公開された113元の記事 ウォンの賞賛105 ・は 20000 +を見て

おすすめ

転載: blog.csdn.net/weixin_43124279/article/details/105419360