2017-03-04 25 views
0

我正在學習Java。我正在構建這個Palindrome識別器,並使用兩個帶有字符的數組,我認爲我用我發現的其他東西得到了很好的實現,但是我正在打破我的頭腦,理解爲什麼它不能按預期工作。發生了什麼:迴文識別器

  • 「回教美國國家航空航天局的聖誕老人」,迴文檢查爲迴文。
  • 「我不知道,什麼」,而不是迴文,檢查不是迴文。
  • 「不是迴文」,而不是一個迴文,支票作爲迴文。

我基本上需要一些幫助來了解到底在哪裏我的代碼錯了。謝謝!

/* 
    "A Santa at Nasa" is an example of palindrome. 
*/ 

import java.util.Scanner; 

public class Palindrome 
{ 
    public static void main (String[] args) 
    { 
     boolean isPalindrome = false; 
     Scanner kb = new Scanner(System.in); 
     System.out.println("Enter a string:"); 
     String userInput = kb.nextLine(); 
     userInput = userInput.trim().replaceAll(" ", "").toLowerCase(); 
     char[] array = new char[userInput.length()]; 
     char[] reverseArray = new char[userInput.length()]; 
     int i = 0; 
     int j = userInput.length(); 

     do { 
      i++; 
      j--; 

      array[i] = userInput.charAt(i); 
      reverseArray[j] = userInput.charAt(j); 

      if (array[i] != reverseArray[j]) 
      { 
       isPalindrome = false; 
      } 
      else 
      { 
       isPalindrome = true; 
      } 

     } while (j > i); 

     if(isPalindrome) 
     { 
      System.out.println("It's a palindrome."); 
     } 
     else 
     { 
      System.out.println("Not a palindrome."); 
     } 
    } 
} 
+2

這聽起來像是一個熟悉使用調試器的好機會。在調試過程中,當您逐行瀏覽代碼並觀察行爲和數值時,邏輯偏離您期望的是什麼點? – David

+2

我認爲這個錯誤來自''++'在'do'循環中。你在獲得角色價值之前增加。 –

+0

我想@ Bathsheba的主要問題,但你也可能想在循環結束時增加你的計數器 - 你沒有檢查第一個字符,但你*將*檢查第一對'j> i'在循環退出之前失敗。 – hugh

回答

2

這裏的問題,你必須輸入數組的第一個元素之前開始,因爲你在你的循環的開始做一個i++

int i = -1; 

此外,你的循環退出條件可以得到改善,所以它退出更早:

while (j > i && !isPalindrome); 
+1

這很有意義,謝謝一堆,Óscar。 –

+0

我只是'while(j> i && isPalindrome);'而是,謝謝! –

4

確定輸入不是迴文後,應該結束測試。

目前你的算法被允許改變主意!

你也過早地增加了我。

0

嗯,問題是,你設置你的isPalindrome每次你檢查兩個字母。所以當最後2個字母檢測結果相同時,它會說它是迴文。所以

import java.util.Scanner; 

public class Main 
{ 
    public static void main (String[] args) 
    { 
     boolean isPalindrome = true; 
     Scanner kb = new Scanner(System.in); 
     System.out.println("Enter a string:"); 
     String userInput = kb.nextLine(); 
     userInput = userInput.trim().replaceAll(" ", "").toLowerCase(); 
     char[] array = new char[userInput.length()]; 
     char[] reverseArray = new char[userInput.length()]; 
     int i = 0; 
     int j = userInput.length() - 1; 

     while(i < j && isPalindrome) { 

      array[i] = userInput.charAt(i); 
      reverseArray[j] = userInput.charAt(j); 

      if (array[i] != reverseArray[j]) 
       isPalindrome = false; 

      i++; 
      j--; 

     } 

     if(isPalindrome) 
      System.out.println("It's a palindrome."); 
     else 
      System.out.println("Not a palindrome."); 
    } 
} 

現在isPalindrome布爾在開始時設置爲true,當我們找到的東西,違背這個(兩個角色是不一樣的),它會設置isPalindrome爲false:相反,試試這個。

我沒有測試此代碼,所以可能會有一些其他的錯誤。但這是我第一眼看到的。

編輯:我沒有從字符串的開頭開始。最好使用一段時間,而不要做,因爲字符串可能是空的。

+1

該操作也搞砸了我,j的作品:可能是意外。 – Bathsheba

+0

我,@Bathsheba?你的意思是從0開始而不是從-1開始?我弄錯了那個,如果是的話,人們已經提出了一個修復方案。謝謝!如果還有其他東西讓我知道。 –

1

你允許使用StringBuilder?如果是這樣,你可以做String reverseText = new StringBuilder(userInput).reverse().toString();

如果不是,爲什麼不嘗試通過遍歷數組一次,然後在年底比較?把你的arrayreverseArray初始值設定爲原樣,但之後再做一個for或while循環,只是忠實地從userInput變量複製到兩個數組中的正確位置。

然後,你可以只使用一個單一的比較,最後才能確定要打印的內容。

+0

我曾經和我一起嘗試過,但我的確有一堆問題纏繞在它身上。 :/ –

+1

你的代碼看起來很簡單,但我會嘗試這兩種。謝謝一堆! :) –

+0

不是問題!讓我知道結果如何。 –

1

一些事情。

  • 您應該在循環結束時進行索引更改,以修復從1開始的較低索引。
  • 隨着之前的更改,您應該從userInput.length()-1開始您的上層索引,因爲那樣將成爲您檢查頂端的第一個索引。
  • ,當你發現一個不匹配你應該停止,否則有奇數長度的字符串,你的結果永遠是中間人物的對證本身(否則你的結果最終會被中間的兩個字符的檢查甚至相互串擾)。

如果您想要完整的重新解決方案,我可以發佈它,但您可以從這裏自行修復它!

+1

那麼,你的解釋已經非常有用了,我肯定我可以從這裏工作,學習是我的目標。謝謝一堆。 :) –