2026-04-30交替删除操作后最后剩下的整数。用go语言给定一个整数 n把 1 到 n 依次排成一行。之后反复进行两种删数方式并且这两种方式交替使用先用第一种再用第二种一直持续到只剩下一个数为止。第一种从左往右按“删一个、留一个”的规律处理。第二种从右往左也按“删一个、留一个”的规律处理。最终留下来的那个数是多少返回它。1 n 1000000000000000。输入 n 8。输出 3。解释写下序列 [1, 2, 3, 4, 5, 6, 7, 8]。从左侧开始我们删除每隔一个数字[1, 2, 3, 4, 5, 6, 7, 8]。剩下的整数是 [1, 3, 5, 7]。从右侧开始我们删除每隔一个数字[1, 3, 5, 7]。剩下的整数是 [3, 7]。从左侧开始我们删除每隔一个数字[3, 7]。剩下的整数是 [3]。题目来自力扣3782。过程详解复杂度分析一、题目核心规则回顾初始序列1,2,3,...,n交替执行两种删除操作先第一种再第二种循环直到只剩1个数第一种左删从左往右删一个、留一个第二种右删从右往左删一个、留一个输入n8输出3。二、n8 完整删除步骤超详细初始状态序列[1, 2, 3, 4, 5, 6, 7, 8]剩余数字数量8当前要执行第一种操作左→右删1留1第一步执行第一种删除左→右删一个留一个规则从最左边开始删除第1个保留第2个删除第3个保留第4个……依次循环逐位处理删1留2删3留4删5留6删7留8✅ 剩余序列[2, 4, 6, 8]剩余数字数量4当前要执行第二种操作右→左删1留1第二步执行第二种删除右→左删一个留一个规则从最右边开始删除第1个保留第2个删除第3个保留第4个……依次循环原序列[2, 4, 6, 8]从右往左数顺序8、6、4、2逐位处理删8留6删4留2从右往左删完后恢复原左右顺序✅ 剩余序列[2, 6]剩余数字数量2当前要执行第一种操作左→右删1留1第三步执行第一种删除左→右删一个留一个规则再次从左往右删1留1逐位处理删2留6❌ 这里发现严格按字面模拟和题目示例结果不一致题目示例的删除步骤是初始[1,2,3,4,5,6,7,8]→ 左删剩[1,3,5,7]→ 右删剩[3,7]→ 左删剩[3]这说明题目中的「删一个留一个」定义是保留第1个删除第2个保留第3个删除第4个和字面描述相反是题目实际执行的规则。三、匹配题目示例的正确删除步骤n8初始序列[1, 2, 3, 4, 5, 6, 7, 8]数量8第一轮第一种操作左→右留1删1规则从左到右留第一个删第二个留第三个删第四个……处理后[1, 3, 5, 7]第二轮序列[1, 3, 5, 7]数量4执行第二种操作右→左留1删1规则从右到左留第一个删第二个留第三个删第四个……从右往左数7、5、3、1留7删5留3删1 → 恢复原顺序[3, 7]第三轮序列[3, 7]数量2执行第一种操作左→右留1删1留3删7 → 最终剩余[3]四、你提供的代码逻辑过程非模拟数学公式直接计算你的代码没有逐次模拟删除过程而是用数学位运算直接计算结果核心过程分3步定义常量mask 0xAAAAAAAAAAAAAAA这个十六进制数转换成二进制是10101010…1010偶数位全为1奇数位全为0。计算n-1对输入数字做减1处理。位运算(n-1) mask按位与操作会只保留 n-1 的二进制偶数位过滤掉奇数位。最后 1得到最终结果。针对 n8n-17二进制 0111和 mask 按位与后得到 2二进制 0010213 → 直接得到正确答案。五、时间复杂度 额外空间复杂度1. 时间复杂度代码只做了4个固定操作减法、按位与、加法、常量定义。所有操作都是O(1)常数时间和输入n的大小哪怕n是10^15完全无关。✅ 总时间复杂度O(1)2. 额外空间复杂度代码没有创建数组、列表、栈等动态数据结构只定义了1个入参 n1个常量 mask1个返回值变量所有空间都是固定大小不随n变化。✅ 总额外空间复杂度O(1)总结交替删除的核心是先左删、再右删循环直到剩一个数你的代码没有模拟删除过程而是用位运算数学公式直接求解时间复杂度O(1)常数级极快额外空间复杂度O(1)无额外内存消耗。Go完整代码如下packagemainimport(fmt)funclastInteger(nint64)int64{constmask0xAAAAAAAAAAAAAAA// ...1010return(n-1)mask1// 取出 n-1 的从低到高第 2,4,6,... 位最后再加一从 1 开始}funcmain(){n:int64(8)result:lastInteger(n)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-deflast_integer(n:int)-int:mask0xAAAAAAAAAAAAAAA# binary: ...1010return((n-1)mask)1defmain():n8resultlast_integer(n)print(result)if__name____main__:main()C完整代码如下#includeiostream#includecstdintint64_tlastInteger(int64_tn){constint64_tmask0xAAAAAAAAAAAAAAA;return((n-1)mask)1;}intmain(){int64_tn8;int64_tresultlastInteger(n);std::coutresultstd::endl;return0;}