2012-08-09 4 views
1

최근에 인터뷰에서이 질문을 받았습니다. 최근 졸업생으로서 2 년 (모든 학교 일)에 대해서만 프로그래밍을 해오 고 있었기 때문에 나는 실망했다. 모호한 아이디어가 있었지만 실패했다고 확신합니다. 이것은 제가 작성한 것입니다 :표준 함수를 사용하지 않고 문자열 반전

이제 집에 왔으므로 테스트를하고 있습니다. 반환 값은 입력의 첫 문자뿐입니다. 나는 막연하게 재귀의 개념에 익숙하지만, 분명히 이것에서 실패하고있다. 어떤 도움/포인터/제안은 대단히 감사하겠습니다. 고맙습니다.

편집

: 데니스 멩의 게시물에 따라 , 나는 다음과 같이 변경했습니다 :

string Reverse(string word, string reversed) 
{ 
    if(word.length() == 0) 
    { 
     return reversed; 
    } 
    else 
    { 
     string temp; 
     reversed = word.substr(0,1) + reversed; 
     temp = word.substr(1); 
     return Reverse(temp, reversed); 
    } 
} 

지금, 나는 적절한 반환 값을 얻을. 너무 감사합니다.

+2

질문은 무엇입니까

std::string reverse(std::string const& character_queue_) { using namespace std; string result; if(!character_queue_.empty()) { vector<char> character_stack; std::copy(character_queue_.begin(),character_queue_.end(),std::back_inserter(character_stack)); while(!character_stack.empty()) { result.push_back(character_stack.back()); character_stack.pop_back(); } } return result; } 

+0

'Reverse' 함수가 * 두 개의 인수 *를 사용하는 이유는 무엇입니까? –

+0

인터뷰에서이 질문을하면 회귀 반복자 쌍을 사용하여 새 문자열을 생성하는 것이 좋습니다. 나는 너에게 완전한 대답을하지 않을 것이다. 너 스스로 그것을 볼 수있다. – marko

답변

2

무슨 잘못가는 것은 여기에있다? 즉, 수행 한 경우 어떻게 되나요

else 
    { 
     string temp; 
     reversed = word.substr(0,1) + reversed; 
     temp = word.substr(1); 
     return Reverse(temp, reversed); 
    } 
} 

대신에? 코드에서 첫 번째 문자 만 반환하는 이유는 참조 별 전달/값 별 전달과 관련됩니다. value-by-stuff 덕분에 재귀 호출에서 수행 된 작업을 실제로 사용하지 않았습니다. (방금 전화를 걸어서 돌려 보낸 것을 버렸습니다.)

+0

대단히 감사합니다! 그 작은 변화가 그랬다. 인터뷰에서 이런 유형의 질문이 평범한가요? 수업에서 강사는 항상 "바퀴를 다시 만들지 마십시오"라고 강조했습니다. 나는 잘못된 사고 방식이 주어 졌는지 궁금합니다. 다시 한 번 감사드립니다! – Renrael

+3

일을 시작하기에 꽤 일반적인 인터뷰 질문입니다. 기초 등을 가지고 있는지 확인하십시오. 강사는 바퀴를 다시 발명하면 안된다는 말에 옳지 만, 바퀴가 어떻게 만들어 졌는지 알면 좋습니다. 면접자가 원합니다. 어쨌든 대답 이상의 생각 과정을 알기. –

+0

(다른 사람들은이 작업을 수행하는 훨씬 더 좋은 방법이 있다는 것을 말하고 있지만, 인터뷰 질문에서이 접근법은 완벽하게 훌륭하다고 말하고 싶습니다.) –

1

여기서 왜 재귀를 사용하는지 잘 모르겠습니다. 정말 불필요 : 모든

string Reverse(string word) 
{ 
    string reversed = ""; 

    if(word.length() == 0) 
    { 
     return reversed; 
    } 

    for (int i = word.length()-1; i>=0; i--){ 
     reversed = reversed+word[i]; 
    } 

    return reversed; 
} 
+4

"sizeof (word)'"- nononononooNO! – Xeo

+0

@Xeo는 자세히 설명합니까? – ewok

+1

@ewok'sizeof (word)'는 문자열의 길이가 아니라'std :: string' 클래스의 크기를 반환합니다. 이것은 원하는 것이 아닙니다. 'word.size()' – Praetorian

1
string Reverse(string word, string reversed) 
{ 
    ... 
    Reverse(temp, reversed); 

먼저 참조 const를 참조하여 wordreversed을 통과해야한다. 재귀 함수를 호출하면 각 문자열의 복사본을 만들고 있으므로 가장 바깥 쪽 함수는 아무 것도 볼 수 없습니다. 또 다른 옵션은 recursed 함수의 결과를 reversed에 할당하는 것이었지만 여전히 바보 같은 수의 문자열 복사본이 있습니다. 그래서 : 변수를 참조로 전달하십시오.

둘째 : 문자열을 반대하는 방법 쉬운 방법을있다 :

string Reverse(string word) //caller should _not_ see my changes, so I pass by value 
{ 
    for(int i=0; i<word.size()/2; ++i) { //for each letter in the first half 
     int otherindex = word.size()-1-i; //find the letter on the other half 
     char t = word[i]; //and swap them 
     word[i] = word[otherindex]; 
     word[otherindex] = t; 
    } 
    return word; //return the result 
} 
0

문자열은 문자의 배열에 불과하다. 일반적으로이 경우 알고리즘을 설명하기 위해 문자 배열을 사용해야합니다. 여기에 더 좋은 방법이 있습니다. 같은 질문 자바에 요청하는 경우

void reverse(char* str, int len) 
{ 
    for (int i = 0, j = len -1 ; i < len/2; ++i, --j) { 
     // Swap the values as i and j. 
     int temp = str[i]; 
     str[i] = str[j]; 
     str[j] = temp; 
    } 
} 

, 당신은 [] 배열이 그것을 반대하고 문자열을 형성 숯불에 문자열을 변환되었는지 확인해야합니다. 이것은 생성되는 객체의 수를 최소화하는 데 도움이됩니다. 적어도 StringBuilder를 사용해야합니다.

else 
    { 
     string temp; 
     reversed = word.substr(0,1) + reversed; 
     temp = word.substr(1); 
     Reverse(temp, reversed); // <-- Here's your problem 
    } 

    return reversed; 
} 

당신은 전화가 정답을 반환해야 함을 알고, 왜 그냥 반환하지 :

+1

C++에서 StringBuilder가 필요하지 않습니다. 문자열은 변경할 수 있습니다. 그리고 연산자가'operator []'를 구현했기 때문에 문자열을 이미 알고 있기 때문에'len'을 더 이상 전달할 필요가 없다는 점을 제외하면이 매우 동일한 알고리즘을 효과적으로 사용할 수 있습니다. : P – cHao

0

다음은 이미 게시 된 해결책과 비슷합니다. 하지만 이제는 표준 솔루션을 사용하기 때문에이 솔루션이 좋지 않다는 것을 알았습니다.

문자열 반전 ++ C에서 재귀를 사용하여 :

#include <iostream> 
#include <string> 
using namespace std; 

string reverseStringRecursively(string str){ 
    if (str.length() == 1) { 
     return str; 
    }else{ 
     return reverseStringRecursively(str.substr(1,str.length())) + str.at(0); 
    } 
} 

int main() 
{ 
    string str; 
    cout<<"Enter the string to reverse : "; 
    cin>>str; 

    cout<<"The reversed string is : "<<reverseStringRecursively(str); 
    return 0; 
} 
-2

그냥 처리 재귀의 더 나은 방법을 제안 하는가? 그들이 재귀와 함께 해결하도록 요청 했습니까?
+0

Google "Painter 's Algorithm" :피 – cHao

관련 문제