例如,为我提供了一个数组:1、3、9、6、5、8、3、4 问题是我必须在上述数组中找到总和为9的对。但是,该对不能重复。这意味着,如果我已经找到了第一对[3,6],那么第二对[6,3]将不被接受。
此问题的输出应为[1,8] [3,6] [5,4](没有[6,3],因为它是重复的)
我使用Java 8解决了这个问题。
以下是我尝试的一些代码:
public static void printSumNine(int[] input)
{
for (int i = 0; i < input.length - 1; i++) {
for (int j = i + 1; j < input.length; j++) {
if (9 - input[i] == input[j]) {
System.out.println("[" + input[i] + ", " + input[j] + "]");
}
}
}
}
然后我将输入内容放入参数中
int input[] = {1, 3, 9, 6, 5, 8, 3, 4};
我希望输出应为:
[1, 8]
[3, 6]
[5, 4]
但是我的代码产生了不同的输出:
[1, 8]
[3, 6]
[6, 3]
[5, 4]
答案 0 :(得分:1)
----- **更新以获得更好的解决方案** ------
如果您不介意数字的成对顺序,我建议您使用Set
,它只需O(N)即可比当前解决方案中的O(NlogN)更好地完成任务。 / p>
解决方案:
int N = 9;
Set<Integer> set = new HashSet<>();
int[] input = new int[] { 1, 3, 9, 6, 5, 8, 3, 4 };
for (int i = 0; i < input.length; i++) {
//condition N = input[i] * 2 is for some cases such as (N = 8, and array contains 2 numbers which have same value 4)
if (set.contains(N - input[i]) && (!set.contains(input[i]) || (N ==input[i] *2)) {
System.out.println(input[i] + " - " + (9 - input[i]));
}
set.add(input[i]);
}
Hashset.contains的复杂度为O(1),而您只需要运行1个循环即可解决问题。
我建议使用Map
删除重复项。
Map<Integer, Integer> usedMap
这是我的修改版本。尽管它的复杂性不好,但是可行。如果可以找到其他具有更好复杂性的方法,我将对其进行编辑。
Map<Integer, Integer> usedMap = new HashMap<Integer, Integer>();
int[] input = new int[] { 1, 3, 9, 6, 5, 8, 3, 4 };
for (int i = 0; i < input.length - 1; i++) {
if (!usedMap.containsKey(input[i])) {
for (int j = i + 1; j < input.length; j++) {
if (!usedMap.containsKey(input[j])) {
if (9 - input[i] == input[j]) {
System.out.println("[" + input[i] + ", " + input[j] + "]");
usedMap.put(input[j], 1);
}
}
}
usedMap.put(input[i], 1);
}
}
答案 1 :(得分:0)
尝试此代码。我已经使用哈希表存储数据。打印时,我在打印前验证哈希图中的值。
dlsym
答案 2 :(得分:0)
首先,添加重复对以检查您的方法,如下所示:
import asyncio
import websockets
async def ws_rec(websocket, path):
while True:
data = await websocket.recv()
print(data)
start_server = websockets.serve(ws_rec, 'localhost', 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
print("ok")
,假设m+n=s
和m<n
n-m=x
m+n=m+m+x=s
因为m不同,所以x也不同,所以我们可以使用x来标识对,而每个对都需要一点标记:
x=s-2m
解决此问题的常用方法,需要花费public static void printSumNine(int[] input) {
BitSet checkPool = new BitSet(input.length);
for (int i = 0; i < input.length - 1; i++) {
for (int j = i + 1; j < input.length; j++) {
if (9 - input[i] == input[j]) {
int checkSum = Math.abs(input[i] - input[j]);
if (!checkPool.get(checkSum)) {
checkPool.flip(checkSum);
System.out.println("[" + input[i] + ", " + input[j] + "]");
}
}
}
}
}
的时间并且不需要其他内存:
nlog(n)