2014-03-25 2 views
-1

상수 공간을 사용하여 문자열의 단어를 바꿔 넣기를 원합니다. catch는 단어가 연속적인 공백을 포함 할 수 없다는 것입니다. 단어 사이의 모든 연속 공백을 하나의 공백으로 줄이고 공백 및 공백을 무시하고 싶습니다. 나는 단어의 반전을 구현할 수 있었지만 단어와 앞뒤 공백 사이의 연속 공백을 제거하는 것을 고심하고있다. 누군가 나를 도울 수 있습니까?char []/문장의 자리 바꾸기 단어

public char[] reverseWords(char[] s) { 

    if (s == null) 
     return null; 

    int right = 0; 


    s = reverseString(s, 0, s.length - 1);// get the reversed sentence 
    //System.out.println(s); 
    for (int left = 0; left < s.length; left++) { 

     if (s[left] != ' ') {// for first word 

      for (right = left; right < s.length && s[right] != ' '; right++) 
       ; // get end of word 

      s = reverseString(s, left, right - 1); 
      left =(right - 1);// move left index to end of 
               // word 

      // s[left++] = ' '; 
     } 

    } 
    return s; 
} 

public char[] reverseString(char[] strChars, int start, int end) { 

    if (strChars == null) 
     return null; 

    while (start < end) { 

     char temp = strChars[start]; 
     strChars[start] = strChars[end]; 
     strChars[end] = temp; 

     start++; 
     end--; 
    } 
    return strChars; 
} 
+0

예, 전체 문장의 문자 배열로 어떻게 할 수 있습니까? – user2441441

+0

오른쪽. 나는 당신의 질문이 "문자열"이라고 생각했습니다. 내 잘못이야. –

+0

'.replace ("", "")'할 수 있습니까? – Aarowaim

답변

1

쉽게/빠른 방법이있을 것입니다 : 여기

는 내가 지금까지 가지고있는 것입니다. 나는 지금 막 배운 목적이 있어야한다고 생각합니다.

먼저, 지금 가지고있는 작업을 수행하고 역순으로 단어를 연속적으로 입력하십시오.

그런 다음 연속적인 공간 제거를 수행하는 다른 방법을 작성하십시오.

포인터가 2 개인 경우 첫 번째 위치에서 시작하여 공간이 아닙니다.

A와 B는 계속 함께 움직입니다.

(A! = B), 우리는 s[A]s[A-1] 경우 공간, 후 정지 (A는 제 2 공간에서 지금), 만 B가 전진을 계속한다 s[A] = s[B]; s[B] = ' ';

할 경우. 그런 식으로 A는 같은 위치를 유지하고 B가 공백이 아닌 문자를 줄 때까지 B에서 계속 복사합니다.

그리고 B가 끝나면 끝납니다.

사이비 코드

, 그것은이다

int a = first position of non-space; 
int b = a; 

while b < s.size() { 
    if (a != b) { 
    s[a] = s[b] 
    s[b] = ' ' 
    } 
    if (both s[a] and s[a-1] are space) { 
    increment b; 
    // leave a untouched 
    } else { 
    increment a; 
    increment b; 
    } 
} 

상수 공간 같은, O 단어를 반전 할 때 장소에서 연속 공간의 제거를 처리 할 수 ​​(n)의 시간


또 다른 방법은, :

힌트는 반대로 할 때 여분의 공백을 포함합니다.

주어진 문자열

abc def  ghi 
L     (left)  

첫 번째 반전은 중요하지 않으므로 생략합니다.힌트는 두 번째 단어를 들어, 바로 최초의 우주 후 위치에서 L을 중지하려고한다 :

cba def  ghi 
    L 

이 역의 "오른쪽"면이 단어의 첫 번째 권리 경계가 될 것입니다 :

cba def  ghi 
    L R 

는 그런 역을 다시 시작

cba fed  ghi 
    L R 

그런 다음 L의 다음 위치를 찾아 계속 자리에 역을 수행

,
cba fed  ghi 
     L 

cba fed ihg  
     L  R 
1

아주, 아주 간단한 한 줄 솔루션 REGEX (short for REGular EXpression)을 사용하는 것입니다 유사한 논리를

cba fed  ghi 
     L  R 

을 가져 가라. 이 작업을 수행하는 방법은 두 가지이며이 경우 String#replaceAll()String#trim() 메서드를 사용하고 있습니다. 그래서, 여기 간다 :

String line = " Hello  World! "; 
line = line.replaceAll(" +", " "); // '+' = 1 or more i.e. at least 1. 
// Hence it replaces ALL white spaces with a single space. 
line = line.trim(); //This 'trims' the String to remove all leading and trailing 
// whitespaces. 
System.out.println(line); //Output: "Hello World!" 

더 허용 연습 "\\s+" 대신 " "을 사용하는 것입니다. (사실 문자는 \s이지만 String에 저장할 때는 이중 슬래시를 사용해야합니다.) 동일한 결과가 나타납니다. Pattern - Matcher 접근 방식을 사용해 볼 수도 있습니다.