我的问题实际上并不是代码,我知道如何反转字符串。
这是一个非常常见的面试问题,所以我想澄清一下我认为正确的解决方案。
所以前提开始,你在字符串的末尾有一个计数器,然后在开头有一个。然后你交换他们指向的两个字符。
有两种方法可以做到这一点......
三个变量,一个(A,B,Temp),您可以使用常用方法切换A和B.
两个变量,在A ^ B,B ^ A,A ^ B之间使用XOR三次。
两者都实现了相同的结果,但我已经读过,虽然第一种方法实际上使用了更多的变量,但它实际上并没有使用更多的内存,因为现在更聪明的C编译器认识到Temp是一个临时变量并使用CPU来存储它然后垃圾而不是把它放在内存堆栈上。因此,第一个解决方案是否会更好?"因为它更容易理解,实质上只使用与第二种解决方案相同的内存量?
谢谢!
答案 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;
可能在a
和b
的类型具有陷阱表示的奇异系统上遇到问题;你不太可能遇到这样的问题,但编写更简单的代码会让你更少担心。它不能用于非整数类型(指针,浮点值或结构没有^
)。如果被交换的东西不是简单的变量名,那么a
和b
可以引用同一个对象:
int *p0, *p1;
*p0 = *p0 ^ *p1;
/* etc */
在这种情况下,两个值都将被破坏。
xor hack非常聪明。这不是一件好事。任何“非常聪明”的东西都应该被严肃地怀疑。
你标记了问题“C”,但你在标题中使用了“理论”这个词,所以我会在支持它的语言中提到,你可以这样做:
(a, b) = (b, a);
答案 1 :(得分:0)
在所有其他条件相同的情况下,更易读的代码更好。在这种情况下,这将是使用Temp变量的代码。此外,它适用于被反转的元素不是简单整数对象的情况。
答案 2 :(得分:0)
正确的解决方案是有效的解决方案 一个好的解决方案是你可以阅读的。
良好和正确几乎总是最好的。特别是面试。