欢迎大家解题,过阵子会谈谈解法
感觉三进制不进位加法应该能解决这个问题
用暴力法实现了一下,不知道怎么优化
更新:发现负数处理问题,调试发现直接(unsigned long long)相当于(unsigned long long)(long long),会扩展符号位,要(unsigned long long)(unsigned)才会用零填充高位,坑了。。。已修正
<code class="language-cpp">#include <stdio.h> int main(int argc, char *argv[]) { int count, nums[256]; scanf("%d", &count); for (int i = 0; i < count; i++) scanf("%d", &nums[i]); unsigned long long prevresult = count > 0 ? (unsigned)nums[0] : 0; for (int i = 1; i < count; i++) { unsigned long long prev = 0, result = 0; for (unsigned long long j = 3; j <= 10460353203ull; j *="3)" { unsigned long now="(unsigned)nums[i]" % + prevresult j; result - prev) prev="now;" } printf("%d\n", (int)prevresult); return 0; < code></=></stdio.h></code>
引用 Cirno:刚才网上看了看解答,确实脑洞大
欢迎大家解题,过阵子会谈谈解法
看了下其它人的解答,有的确实是用三进制不进位加法的方法,有的不是实现真实的三进制不进位加法,而是用按位计数的方法实现的。。。
要是2个的话就简单了,直接一路xor出结果。。。
让O(n)来得更凶猛吧
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 2^31.
Find the maximum result of ai XOR aj, where 0 ≤ i, j < n.
Could you do this in O(n) runtime?
Example:
<code>Input: [3, 10, 5, 25, 2, 8] Output: 28 Explanation: The maximum result is 5 ^ 25 = 28. </code>
引用 acmilan:我是用 Binary Trie 做的,先用O(31n)时间建Trie,然后再用同样时间把每个数从 Trie 里边过一遍,但是遇到有分岔的时候就走岔道,并且update这个 bit,过完一遍就得到 一个新的 xor 值。其他的解法还在想
上述题目可以经过线性时间的变换,转换为常数时间问题(因为相同数值的xor等于0,又限制了数值范围),所以。。。又回到了暴力法
仔细想了想,上述问题本身不就是线性时间的么,只要你用两层循环……
引用 acmilan:不是说 O(n) 么?
先统计231个整数中有哪些出现了,然后两层循环分别遍历这231个整数,找到最大的xor值。。。
<code class="language-Python">class Solution(object): def findMaximumXOR(self, nums): """ :type nums: List[int] :rtype: int """ head=(None,None) for num in nums: node=head for bit in range(32)[::-1]: chd=int(bool(num&(1<<bit))) if node[chd]="=None:" newnode="(None,None)" node="NewNode" else: maxxor="0" for num in nums: curxor="0" bit range(32)[::-1]: chd="int(bool(num&(1<<bit)))" node[1^chd]: curxor|="1<<bit" return < code></bit)))></code>
引用 Cirno:对啊,线性时间→_→统计一个数列中数有哪些出现了不是线性时间么→_→要是觉得不严谨咱再在第二个双层循环里边的else语句里塞个空语句
不是说 O(n) 么?
引用 acmilan:你两层循环就是 n(n-1) 次了。。。。
对啊,线性时间→_→统计一个数列中数有哪些出现了不是线性时间么→_→要是觉得不严谨咱再在第二个双层循环里边的else语句里塞个空语句
引用 Cirno:231*231啊,怎么会是n(n-1)→_→
你两层循环就是 n(n-1) 次了。。。。
引用 acmilan:→_→。。。。啊,题目里边其实是 2^31,不是 231,编辑错了
231*231啊,怎么会是n(n-1)→_→
引用 acmilan:但还是理解不能你的思路。。。算了
231*231啊,怎么会是n(n-1)→_→
引用 Cirno:那就只能用你的方法了→_→
→_→。。。。啊,题目里边其实是 2^31,不是 231,编辑错了
引用 acmilan:虽然打错但本质上没区别啊。。。表示完全没有理解你的意思
那就只能用你的方法了→_→
引用 Cirno:怎么会本质上没区别→_→231和2^31差别还是很大的
虽然打错但本质上没区别啊。。。表示完全没有理解你的意思
引用 acmilan:这对算法自由度没有半毛钱影响啊
怎么会本质上没区别→_→231和2^31差别还是很大的
引用 Cirno:→_→第一不具备可行性(至少要跑147年),第二循环内的隐性时间增长变成上不封顶了
这对算法自由度没有半毛钱影响啊
引用 acmilan:彻底服了你。。。。花那么多时间折腾各种冷门编程框架,学一下正经的computer science基础不好么,以亲身经验表示研究“规律”远比“规则”来得长远。此帖作废,不再更新。。不再回复反驳。。这里完全讨论不下去。。。
→_→第一不具备可行性(至少要跑147年),第二循环内的隐性时间增长变成上不封顶了
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。