You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否可以减少数组元素交换操作中的赋值运算次数

现有代码的问题

你现在贴的这段代码本身就有逻辑bug,根本实现不了交换功能:你存了a.board[i]的值到temp后,直接把a.board[i]赋值给a.board[j],直接把a.board[j]原来的值冲没了,最后把temp塞回a.board[i],两个位置最后都是原来i位置的值,等于白写。

正确的常规实现(最推荐)
private Board exch(Board a, int i, int j) { // 交换数组中两个位置的元素
    int temp = a.board[i];
    a.board[i] = a.board[j];
    a.board[j] = temp;
    return a;
}

这种写法没有任何前置限制,不管i和j是不是同一个下标、元素数值多大都能正常跑,可读性最高,是业界最常用的写法,没啥特殊需求就用这个就行。

可选的简化写法
  • 无临时变量的算术交换(仅适合int类型,且两数相加不会溢出的场景,可读性差一些)
private Board exch(Board a, int i, int j) {
    if (i == j) return a; // 下标相同没必要交换,也避免计算出问题
    a.board[i] = a.board[i] + a.board[j];
    a.board[j] = a.board[i] - a.board[j];
    a.board[i] = a.board[i] - a.board[j];
    return a;
}
  • 无临时变量的异或交换(仅适合int类型,且i和j不能是同一个下标,可读性更低)
private Board exch(Board a, int i, int j) {
    if (i == j) return a; // 下标相同直接返回,否则对应位置的值会变成0
    a.board[i] ^= a.board[j];
    a.board[j] ^= a.board[i];
    a.board[i] ^= a.board[j];
    return a;
}
  • Java 21及以上版本可以用平行赋值语法,代码更短,可读性和效率都在线:
private Board exch(Board a, int i, int j) {
    // Java 21+ 支持的元组平行赋值写法
    (a.board[i], a.board[j]) = (a.board[j], a.board[i]);
    return a;
}

划重点:除非你有极致的性能要求,不然老老实实选带临时变量的常规写法就好,没有坑,后续别人看代码也不用费脑子猜逻辑。

内容的提问来源于stack exchange,提问作者ConstructionCat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:36:03