我们有一个生成的列表:
1. 003
2. 012
3. 021
4. 030
5. 102
6. 111
7. 120
8. 201
9. 210
10. 300
(数字从0到3,它们的总和是3)
如何在不计算它们的情况下找到组合的位置? 防爆。 201 - >索引= 8 提前谢谢。
答案 0 :(得分:4)
如果你的号码是ABC,那么索引是:
ndx = A * (8 - A + 1) / 2 + B + 1;
例如,对于值ABC = 201,我们将:
ndx = 2 * (8 - 2 + 1) / 2 + 0 + 1 = 8;
实际上,值201的索引为8。
答案 1 :(得分:1)
不是一个完整的答案,但我认为这是一个好的开始。
如果您将每个数字视为两位二进制数字,则会得到:
1. 003 00 00 11
2. 012 00 01 10
3. 021 00 10 01
4. 030 00 11 00
5. 102 01 00 10
6. 111 01 01 01
7. 120 01 10 00
8. 201 10 00 01
9. 210 10 01 00
10. 300 11 00 00
如果忽略右手数字列,则前七项(值003到120)是数字0到6的二进制表示。
接下来的两个项目的值为8和9,最后一个是12。
因此,我们可以将数字转换为粗略索引:
ix = 4*first_digit + second_digit
然后调整:
if (first_digit < 2)
ix = ix + 1
else if (first_digit == 3)
ix = ix - 2
我对那里的条件不满意。有没有数学方法来进行这种翻译:
0 => 1
1 => 1
2 => 0
3 => -2
答案 2 :(得分:1)
是的,我所提出的问题下的评论假设您希望直接从当前值转到索引,而不执行搜索。也就是说,对条目的数字进行一些检查并将其转换为1索引号。
请注意,这个答案是方向性和不完整的,只是说明了解决问题的方式。
查看您的示例,如果我们将每个条目视为由3位数字(z_i,y_i,x_i)组成,那么您将获得以下序列:
如果最大数字是 k (= 3),那么:
x_i = 3, 2, 1, 0, 2, 1, 0, 1, 0, 0 = k, k-1, ..., 0, k-1, ... 0, ......, 0
y_i = 0, 1, 2, 3, 0, 1, 2, 0, 1, 0 = 0, 1, ..., k, 0, ..., k-1, ......, 0
z_i = 0, 0, 0, 0, 1, 1, 1, 2, 2, 3 = k+1 x 0, k x 1, ......., 1 x k
正如您所看到的, y_i 数字按顺序重复上升,在每次完成结束时敲响 z_i 。
如果你有更多的数字,模式会变得更复杂,但仍然遵循类似的模式。
k = 4 :
可以从第一列或最后一列看到总条目,在k+1
的情况下,它是三角形编号k=4
的三角形编号。对于k=3
,它只是k+1
的三角形。
没有将其解决,但该模式可能表示随着位数的增加而连续求和。
还有一种模式:
k=3
:
k=4
:
k=5
:
或者一般来说,长度 k 序列中的条目总数:
这些知识有助于我们找到第一个数字的标量,其余问题实际上是k-1
的子问题。此刻击败我......
答案 3 :(得分:0)
使用Collections.binarySearch
。
检查http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#binarySearch(java.util.List,T)