最小化相同索引字元的交換次數,以使兩個字串的ASCII值之和為奇數


在本文中,我們深入探討了一個關於字串操作和計算機科學中字元編碼的引人入勝的問題。我們的任務是最小化兩個字串中相同索引字元之間的交換次數,以使兩個字串中字元的ASCII值之和為奇數。這是一種強大且通用的程式語言,深受許多軟體開發人員的青睞。

瞭解ASCII

ASCII,即美國資訊交換標準程式碼,是用於電子通訊的字元編碼標準。ASCII程式碼表示計算機、電信裝置和其他使用文字的裝置中的文字。

問題陳述

我們得到兩個長度相等的字串。目標是執行最少的相同位置字元交換,以便每個字串中字元的ASCII值之和為奇數。

解決方案方法

  • 計算ASCII總和  計算每個字串的ASCII值之和。然後,檢查總和是偶數還是奇數。

  • 確定交換需求  如果總和已經是奇數,則不需要交換。如果總和是偶數,則需要交換。

  • 查詢可交換項  查詢兩個字串中交換後會產生奇數和的字元。跟蹤交換次數。

  • 返回結果  返回所需的最少交換次數。

示例

以下是適用於所有場景的修改後的程式碼:

#include <stdio.h>
#include <string.h>

int minSwaps(char* str1, char* str2) {
   int len = strlen(str1);
   int ascii_sum1 = 0, ascii_sum2 = 0;

   for (int i = 0; i < len; i++) {
      ascii_sum1 += str1[i];
      ascii_sum2 += str2[i];
   }

   // If total sum is odd, it's impossible to have both sums odd
   if ((ascii_sum1 + ascii_sum2) % 2 != 0) return -1;

   // If both sums are odd already, no swaps are needed
   if (ascii_sum1 % 2 != 0 && ascii_sum2 % 2 != 0) return 0;

   // If both sums are even, we just need to make one of them odd
   if (ascii_sum1 % 2 == 0 && ascii_sum2 % 2 == 0) {
      for (int i = 0; i < len; i++) {
         if ((str1[i] - '0') % 2 != (str2[i] - '0') % 2) return 1;
      }
   }

   // If we reach here, it means no eligible swaps were found
   return -1;
}
int main() {
   char str1[] = "abc";
   char str2[] = "def";

   int result = minSwaps(str1, str2);
   if (result == -1) {
      printf("No valid swaps found.\n");
   } else {
      printf("Minimum swaps required: %d\n", result);
   }

   return 0;
}

輸出

No valid swaps found.
#include <bits/stdc++.h>
using namespace std;

int minSwaps(string str1, string str2) {
   int len = str1.length();
   int ascii_sum1 = 0, ascii_sum2 = 0;
   
   for (int i = 0; i < len; i++) {
      ascii_sum1 += str1[i];
      ascii_sum2 += str2[i];
   }
   
   // If total sum is odd, it's impossible to have both sums odd
   if ((ascii_sum1 + ascii_sum2) % 2 != 0) return -1;
   
   // If both sums are odd already, no swaps are needed
   if (ascii_sum1 % 2 != 0 && ascii_sum2 % 2 != 0) return 0;
   
   // If both sums are even, we just need to make one of them odd
   if (ascii_sum1 % 2 == 0 && ascii_sum2 % 2 == 0) {
      for (int i = 0; i < len; i++) {
         if ((str1[i] - '0') % 2 != (str2[i] - '0') % 2) return 1;
      }
   }

   // If we reach here, it means no eligible swaps were found
   return -1;
}
int main() {
   string str1 = "abc";
   string str2 = "def";
   
   int result = minSwaps(str1, str2);
   if(result == -1) {
      cout << "No valid swaps found.\n";
   } else {
      cout << "Minimum swaps required: " << result << endl;
   }
   
   return 0;
}

輸出

No valid swaps found.
public class Main {
   public static int minSwaps(String str1, String str2) {
      int len = str1.length();
      int asciiSum1 = 0, asciiSum2 = 0;

      for (int i = 0; i < len; i++) {
         asciiSum1 += str1.charAt(i);
         asciiSum2 += str2.charAt(i);
      }

      // If total sum is odd, it's impossible to have both sums odd
      if ((asciiSum1 + asciiSum2) % 2 != 0)
         return -1;

      // If both sums are odd already, no swaps are needed
      if (asciiSum1 % 2 != 0 && asciiSum2 % 2 != 0)
         return 0;

      // If both sums are even, we just need to make one of them odd
      if (asciiSum1 % 2 == 0 && asciiSum2 % 2 == 0) {
         for (int i = 0; i < len; i++) {
            if ((str1.charAt(i) - '0') % 2 != (str2.charAt(i) - '0') % 2)
               return 1;
         }
      }

      // If we reach here, it means no eligible swaps were found
      return -1;
   }

   public static void main(String[] args) {
      String str1 = "abc";
      String str2 = "def";

      int result = minSwaps(str1, str2);
      if (result == -1) {
         System.out.println("No valid swaps found.");
      } else {
         System.out.println("Minimum swaps required: " + result);
      }
   }
}

輸出

No valid swaps found.
def min_swaps(str1, str2):
   length = len(str1)
   ascii_sum1 = sum(ord(ch) for ch in str1)
   ascii_sum2 = sum(ord(ch) for ch in str2)

   # If total sum is odd, it's impossible to have both sums odd
   if (ascii_sum1 + ascii_sum2) % 2 != 0:
      return -1

   # If both sums are odd already, no swaps are needed
   if ascii_sum1 % 2 != 0 and ascii_sum2 % 2 != 0:
      return 0

   # If both sums are even, we just need to make one of them odd
   if ascii_sum1 % 2 == 0 and ascii_sum2 % 2 == 0:
      for i in range(length):
         if int(str1[i]) % 2 != int(str2[i]) % 2:
            return 1

   # If we reach here, it means no eligible swaps were found
   return -1

str1 = "abc"
str2 = "def"

result = min_swaps(str1, str2)
if result == -1:
   print("No valid swaps found.")
else:
   print("Minimum swaps required:", result)

輸出

No valid swaps found.

解釋

考慮兩個字串:

str1 = "abc", str2 = "def"

我們計算str1 (294: a = 97, b = 98, c = 99) 和str2 (303: d = 100, e = 101, f = 102) 的ASCII總和。ASCII總和為597,這是一個奇數。因此,不可能使兩個總和都為奇數,程式將輸出“未找到有效的交換”。

此解決方案使用簡單的程式設計結構和邏輯推理有效地解決了問題。

結論

最小化交換次數以達到奇數ASCII值之和的任務是一個有趣的問題,它增強了我們對字串操作、字元編碼和問題解決能力的理解。提供的解決方案使用了各種程式語言,並演示瞭如何在問題陳述中處理不同的場景。

需要注意的是,此解決方案假設兩個字串具有相同的長度。如果長度不同,則需要額外的邏輯來處理這種情況。

更新於:2023年10月27日

86 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.