gpt4 book ai didi

c - 反转字符串(理论)

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:32 30 4
gpt4 key购买 nike

我的问题实际上与代码无关,我知道如何反转字符串。

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

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

有两种方法...

三个变量,一个(A,B,Temp),可以用普通的方法切换A和B。

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

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

谢谢!

最佳答案

恕我直言,交换两个 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 明确(向读者和编译器)该值在初始化后不会更改。

您可能更愿意将以上内容包含在一个 block 中(根据 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);

关于c - 反转字符串(理论),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25024379/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com