微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

进一步优化交换

如何解决进一步优化交换

我在面试中被问到交换两个变量的问题,我给出了以下代码

package com.main;

public class Test {

    public static void main(String[] args) {
        int var1 = 6,var2 = 10;
        System.out.println("Before Swap var1 = "+var1+" and var2 = "+var2);
        int temp = var1;
        var1 = var2;
        var2 = temp;
        System.out.println("After Swap var1 = "+var1+" and var2 = "+var2);
    }

}

不过面试官说可以进一步优化。它的时间复杂度是 O(1),空间复杂度也是 O(1)。还有什么可以优化的?

解决方法

您可以使用按位异或运算符来避免辅助空间

FYR 代码:

int var1 = 6,var2 = 10;
var1 = var1 ^ var2 ^ (var2 = var1);
System.out.println("After Swap var1 = "+var1+" and var2 = "+var2);

替代方案

有多种方法可以交换变量,例如使用加法和删除或乘法和除法等算术运算符。我发现 GFG 上的这些 Article 1Article 2 有助于理解各种方法。

注意

空间和时间方面的复杂性仍将与渐近分析相同。

,

没什么。面试官是个白痴。

他们正在寻找这个。他们是荒谬的,期望受访者得到这个是白痴,因此我称他们为白痴。我不建议您应该在实际代码中编写此代码。我不会建议你主动“不知道”一件事,因为所有的知识都是有价值的,但考虑到你永远不应该在实际代码中这样做,而且这将产生的性能影响不是你想要的曾经能够衡量,知道这一点的价值极低:

var1 = var1 ^ var2;
var2 = var1 ^ var2;
var1 = var1 ^ var2;

这看起来很时髦,但尝试一下,你会发现它“有效”。

在实践中,如果有的话,它可能比你写的要慢,但解释为什么需要一年时间研究 CPU 和管道的工作原理。

解释上述为什么有效,在网络上搜索按位异或的作用(^ 是 java 中的按位异或),选择一些示例数字,例如 4 和 5,然后试一试。只需一步一步地完成它。或者在网络上搜索解释,大量的博文解释了这个异国情调的角落。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。