扭转一个字符串(理论)

时间:2014-07-29 20:28:26

标签: c string reverse

我的问题实际上并不是代码,我知道如何反转字符串。

这是一个非常常见的面试问题,所以我想澄清一下我认为正确的解决方案。

所以前提开始,你在字符串的末尾有一个计数器,然后在开头有一个。然后你交换他们指向的两个字符。

有两种方法可以做到这一点......

三个变量,一个(A,B,Temp),您可以使用常用方法切换A和B.

两个变量,在A ^ B,B ^ A,A ^ B之间使用XOR三次。

两者都实现了相同的结果,但我已经读过,虽然第一种方法实际上使用了更多的变量,但它实际上并没有使用更多的内存,因为现在更聪明的C编译器认识到Temp是一个临时变量并使用CPU来存储它然后垃圾而不是把它放在内存堆栈上。因此,第一个解决方案是否会更好?"因为它更容易理解,实质上只使用与第二种解决方案相同的内存量?

谢谢!

3 个答案:

答案 0 :(得分:2)

恕我直言,交换两个int对象的最简单方法如下:

int a, b; /* these are the variables we want to swap */
...
const int old_a = a;
a = b;
b = old_a;

名称old_a(与通用temp不同)描述了它所拥有的值。 const清楚地表明(对于读者和编译器)该值在初始化后不会改变。

您可能更愿意将上述内容包含在一个块中(根据您需要的C90规则):

{
    const int old_a = a;
    a = b;
    b = old_a;
}

这限制了临时范围,但是大括号会增加视觉上的混乱。

任何体面的编译器都应该能够为此生成良好的代码 - 至少与使用xor hack一样好。

另一方面,xor hack:

a = a ^ b;
b = a ^ b;
a = a ^ b;

可能ab的类型具有陷阱表示的奇异系统上遇到问题;你不太可能遇到这样的问题,但编写更简单的代码会让你更少担心。它不能用于非整数类型(指针,浮点值或结构没有^)。如果被交换的东西不是简单的变量名,那么ab可以引用同一个对象:

int *p0, *p1;
*p0 = *p0 ^ *p1;
/* etc */

在这种情况下,两个值都将被破坏。

xor hack非常聪明。这不是一件好事。任何“非常聪明”的东西都应该被严肃地怀疑。

你标记了问题“C”,但你在标题中使用了“理论”这个词,所以我会在支持它的语言中提到,你可以这样做:

(a, b) = (b, a);

答案 1 :(得分:0)

在所有其他条件相同的情况下,更易读的代码更好。在这种情况下,这将是使用Temp变量的代码。此外,它适用于被反转的元素不是简单整数对象的情况。

答案 2 :(得分:0)

正确的解决方案是有效的解决方案 一个好的解决方案是你可以阅读的。

良好和正确几乎总是最好的。特别是面试。