-2

使用下面的代码,我可以在不创建任何变量的情况下进行字符串反转。但是没有传递任何字符作为参数。

void strrev(char* p, int n)
{
    while ((n -= 2) >= 0)
    { 
        *p++ ^= *(p + n + 1) ^= *p ^= *(p + n + 1);
    }
}

但是,如果,'n' 没有通过并在以下条件下进行反转,该怎么办。

条件:
1. 没有创建额外的局部/全局变量。2. 只有一次遍历 3. 不能使用 str* 例如。strlen 之类的函数。

void strrev(char* p)
{
}

添加:

我同意,没有任何额外的变量创建是不可能的。但是要实现它,要创建多少个最小附加变量。?

4

3 回答 3

0

我尝试使用“n”次迭代来反转“n”个字符。只有一个变量,它将跳转两个位置(q = q+2;),通过 n/2 次迭代达到 \0。然后通过 n/2 次迭代,它将进行替换。所以,我觉得答案是,我们至少需要一个额外的变量来反转具有 n 次迭代的字符串。此外,在 \0 之前不可能只进行一次定向迭代。 请指正,如果有更好的答案。

#include<stdio.h>

void strrev1(unsigned char *p) {
    unsigned char *q = p;

    //jump twice until next or next-to-next byte is '\0'
    while (*(q+1) !='\0' && *q !='\0' ) 
        q+=2;

    //move the backward pointer to the last character before '\0', if its at '\0'
    q = (*q =='\0')? --q:q;

    //now we got 'p' at start and 'q' at last.
    //So, ready to swap now.   
    while (p<q) {
       //swapping - start
       *p = (*p)+(*q);
       *q = (*p)-(*q);
       *p = (*p)-(*q);
       //swapping - end
        p++;//move forward pointer
        q--;//move backward pointer
    }
}
int main() {
    unsigned char s[]="Hai. How are you.";
    strrev1(s);
    printf("\nReversed string is %s \n",s);
    return 0;
}
于 2013-09-02T06:10:20.927 回答
0

您可以通过一长串if条件测试字符串的长度来做到这一点。

void str_rev(char* p)
{
    if (p[0] == 0) return;
    if (p[1] == 0) return;
    if (p[2] == 0) { ...swap p[0],p[1]; return; }
    if (p[3] == 0) { ...swap p[0],p[2]; return; }
    if (p[4] == 0) { ...swap p[0],p[3] and p[1],p[2]; return; }
    ...until your maximum length desired
}

我必须说,效率不是很高。

PS:请注意,这strrev是您不得使用的保留标识符(就像所有str以小写字母开头的标识符一样。)

于 2013-08-30T06:57:25.133 回答
-1

我想这就是你想要的。

 

void reverse ( char* str )
{

        if ( *str ) reverse ( str + 1 ); /* If not end of string, recurse.*/

        if ( *str ) cout << *str; /* print the character */
}

于 2016-06-23T20:56:26.877 回答