2013-11-02 4 views
0

Java 전문가에게 도움이 필요합니다.문자열에서 각 단어를 개별적으로 뒤집는 방법은 무엇입니까?

오늘 나는 인터뷰 중 하나에서이 질문을 받았는데 해결할 수 없었습니다. 그래서이 문제를 해결하는 방법에 대한 해결책이 필요합니다. 이 경우 알파벳과 숫자의 문자열

Input : Hello, World! 
Output : olleH, dlroW! 

반전

는 반전하고 나머지는 쉼표를 의미 느낌표가 같은 장소에 남아 같은 장소에 남아 있습니다.

4 답변을 얻으려면 문자열 기능이 필요합니다.

I가 다음 코드를 시도

  • 수 charAt (c)
  • 길이()
  • setCharAt (I, C)
  • 부울 isAlphaNumeric()
      ;

      public void String(String str){  
          String temp; 
      
          for(int i=str.length-1;i>=0;i--){ 
           temp = temp + str.charAt(i); 
          } 
      } 
      

      하지만 위의 코드는 전체 문자열을 뒤집습니다.

  • +2

    사용하는 단어의주의 : "인플레 이스 그러나

    private static CharSequence reverseWords(CharSequence in) { StringBuilder sb = new StringBuilder(in); for(int i = 0, len = sb.length(); i < len; i++) { if(Character.isAlphabetic(sb.charAt(i))) { int end = i; while(++end < len && Character.isAlphabetic(sb.charAt(end))); int j = end - 1; while(j > i) { char temp = sb.charAt(i); sb.setCharAt(i++, sb.charAt(j)); sb.setCharAt(j--, temp); } i = end; } } return sb; } 

    당신은 모두 StringBuilder 않고 직접 문자 배열을 사용하기를 원한다면 : 나는 당신의 제한을 다음에 얻을 수 이것은 가까이 사용하고 일반적으로 다른 사본을 만들지 않고 동일한 메모리 위치에 있음을 의미합니다. 그리고 자바 문자열은 불변이므로 불가능합니다. – paxdiablo

    답변

    0

    str.split('[^a-zA-Z]')을 사용하여 문자열을 단어로 분할하여 시작하십시오.

    그런 다음 배열을 반복하고 위에서 수행 한 것처럼 각 부분을 뒤집습니다. 마지막으로 문자열을 다시 결합하십시오. 순서대로 분리의 배열을 얻으려면, str.split('[a-zA-Z]')

    예를 사용하려면 :

    String[] words=str.split('[^a-zA-Z]'); 
    String[] separators=str.split('[a-zA-Z]'); 
    
    //Left as an exercise: reverse each element of the words array (as you did in the original question) 
    
    int offset=0; 
    //Left as an exercise: If the sentence starts with punctuation, increment offset by one and insert the punctuation at the beginning 
    
    StringBuilder sb = new StringBuilder(); 
    for(int i=0;i<words.length;i++) 
    { 
        sb.append(words[i]); 
        if(i+offset<separators.length) 
        { 
         sb.append(separators[i+offset]); 
        } 
    } 
    

    편집 :

    난 그냥 방법을 사용할 수있는 질문 지정에 대한 변경 사항을 참조하십시오. 이 특별한 경우에는 split을 수동 구현으로 대체하는 것이 매우 간단하며 연습으로 남겨 둡니다. 이 대답은 copy-paste 솔루션이 아니라이 작업을 구현하는 방법에 대한 의사 코드 아이디어입니다.

    +0

    질문을 읽어주십시오 .. 감사합니다 – skyrocker

    2
    public String reverseString(String str){  
         String temp = "", result = ""; 
         for(int i=0;i<str.length();i++) 
          if ((str.charAt(i)>='A' && str.charAt(i)<='Z') 
           || (str.charAt(i)>='a' && str.charAt(i)<='z') 
           || (str.charAt(i)>='0' && str.charAt(i)<='9')) 
           temp = str.charAt(i) + temp; 
          else { 
           result += temp + str.charAt(i); 
           temp = ""; 
          } 
    
         result += temp; 
         System.out.println(result); 
         return result; 
        } 
    
    +0

    네 번째 방법을 사용해야합니다 :'isAlphaNumeric()' – user2864740

    +0

    +1 나는 이것이 정답이라고 생각합니다. 어쨌든 조금 업그레이드 된 버전은 http://pastebin.com/FWmaCmEz – Pshemo

    2

    당신은 정규식 모든 단어를 찾기 위해 노력하고 반전 버전으로 설립 단어를 대체 할 매처 (Matchers) 방법 appendReplacementappendTail를 사용할 수 있습니다. 당신이 사용할 수있는 단어의 반전 버전을 생성하기 위해

    다음
    StringBuilder().append(word).reverse().toString(); 
    

    당신이 그것을

    을 할 수있는 방법입니다
    public static void main(String[] args) throws Exception { 
        Pattern p = Pattern.compile("\\p{IsAlphabetic}+"); 
    
        StringBuffer sb = new StringBuffer(); 
    
        Matcher m = p.matcher("Hello, World!"); 
        while (m.find()) { 
         m.appendReplacement(sb, reverseWord(m.group())); 
        } 
        m.appendTail(sb); 
    
        System.out.println(sb); 
    } 
    
    private static String reverseWord(String word) { 
        return new StringBuilder().append(word).reverse().toString(); 
    } 
    

    출력 : 문자열은 불변으로

    olleH, dlroW! 
    
    +0

    +1 매우 좋습니다. 나는 결코 전에 appendReplacement/appendTail을 이해하지 못했습니다! 그것은 또한 내 최근 질문 (http://stackoverflow.com/questions/19737653/one-off-equivalent-for-regex-replace-with-function-evaluation) – user2864740

    +0

    답변에 누군가를 표시 해야하는 것 같다 실생활에서이 대답을 사용한다면, OP는 어리석은 인터뷰 요구 사항을 가지고 있습니다 : "당신은 답을 얻기 위해 오직 4 개의 String 함수를 사용할 수 있습니다. charAt (c) 2) length() 3) setCharAt (i, c) 4) boolean isAlphaNumeric() " – user2864740

    +1

    @ 하산 그래서 나는 대답을 upvoted. 어쨌든 실생활에서'for (char ch : str.toCharArray()) {...}'와 같은 향상된 for 루프를 사용하면 루프에서'someString + = anotherString' 대신 StringBuilder에 추가하고' Character.isDigit (ch) || Character.isAlphabetic (ch)'if'. 어쨌든 당신의 대답은 받아 들여 져야합니다. – Pshemo

    0

    setCharAt하지 문자열 함수이며, 그러나 char 배열이나 StringBuilder (char 배열을 래핑하는 것) 중 하나를 사용하여이 작업을 수행 할 수 있습니다. isAlphaNumeric은 어디에서나 찾을 수있는 표준 방법이 아니지만 Character.isAlphabetic은 내가 원하는 것이라고 생각합니다.

    private static String reverseWords(String in) 
    { 
        char[] chars = in.toCharArray(); 
        for(int i = 0, len = chars.length; i < len; i++) 
        { 
         if(Character.isAlphabetic(chars[i])) 
         { 
          int end = i; 
          while(++end < len && Character.isAlphabetic(chars[end])); 
          int j = end - 1; 
          while(j > i) 
          { 
           char temp = chars[i]; 
           chars[i++] = chars[j]; 
           chars[j--] = temp; 
          } 
          i = end; 
         } 
        } 
        return String.valueOf(chars); 
    } 
    
    관련 문제