这个问题是在一次采访中被问到的。
对于给定的整数 n >= 3,返回一个大小为 2n 的数组,使得从 1 到 n 的每个数字 k 恰好出现两次,并且每个数字及其重复项之间的距离等于该数字。
函数签名:
int* buildArray(int n)
例如,对于 n = 3:
3, 1, 2, 1, 3, 2
Number 2
:第一个位置 3 和第二个位置 6,因此距离 6 - 3 - 1 = 2。
Number 3
: First 3
在位置 1 和位置 23
在位置 5,因此距离 5 - 1 - 1 = 3。
对于 n = 4:
4, 1, 3, 1, 2, 4, 3, 2
这是一精确覆盖问题 http://en.wikipedia.org/wiki/Exact_cover,你可以用它来解决算法X http://en.wikipedia.org/wiki/Knuth%27s_Algorithm_X。 (这是一个比数独更好、更简单的示例。)您有以下限制:
- 每个数字必须精确使用两次并且
- 数组中的每个槽只能被一个数字占据
对于您的问题n= 3,则得到如下矩阵:
[0] [1] [2] [3] [4] [5] 1 2 3
--- --- --- --- --- --- --- --- ---
#0 X X X
#1 X X X
#2 X X X
#3 X X X
#4 X X X
#5 X X X
#6 X X X
#7 X X X
#8 X X X
列[x]
意思是那个插槽x
用来;清楚的x
意味着数字x
已放置。 #0 到 #3 行描述了 1 的可能放置,#4 到 #6 描述了 2 的放置,#7 和 #8 描述了放置 3 的两种可能性。这将产生两个(镜像)解决方案:
2 3 1 2 1 3 (#2 + #4 + #8)
3 1 2 1 3 2 (#1 + #6 + #7)
Not all n产生解,例如,5 和 6 就没有解。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)