我的输入是一个整数,假设M
,并且程序必须打印两个整数x
和y
的所有组合,其中x + y = M
。
让我们将输入作为M = 50
,将数组元素作为25 20 25 30 15 45 45 5
而我需要的输出是
5 45,20 30,25 25.
但是我的输出是
5 45,5 45,20 30,25,25
如何删除两次5 45
的出现?
我的代码如下
Scanner s = new Scanner(System.in);
int m = s.nextInt();
s.nextLine();
String str = s.nextLine();
StringTokenizer st = new StringTokenizer(str);
int len = st.countTokens();
int[] a = new int[len];
String[] temp = new String[len];
for (int i = 0; i < len; i++)
{
temp[i] = st.nextToken();
a[i] = Integer.parseInt(temp[i]);
}
Arrays.sort(a);
for (int i = 0;i < len-1; i++)
{
for(int j = i + 1; j < len; j++)
{
if ((a[i] +a [j]) == m)
System.out.println(a[i] + " " + a[j]);
}
}
答案 0 :(得分:0)
(5 45)打印两次,因为输入中有45次出现了2次(25 20 25 30 15 45 45 5),如果需要不同的对,请从数组中删除重复项。
无论如何,这不是最佳的优化解决方案。有关更多详细信息,请检查https://www.geeksforgeeks.org/count-pairs-with-given-sum/
答案 1 :(得分:0)
使用break
跳过重复数字(内循环),然后选中(a[i] - a[i+1]) == 0
并使用continue
跳过外循环中的重复数字。
在for
循环中仅包含以下更改,效果很好
// Init a new array.
for(int i=0;i<len-1;i++)
{
if((a[i] - a[i+1]) == 0)
continue; // for skipping repeated number in outer loop
for(int j=i+1;j<len;j++)
{
if((a[i]+a[j])==m ) {
System.out.println(a[i]+" "+a[j]);
break; // for skipping repeated number in inner loop
}
else if(a[i] == m/2){
System.out.println(a[i]+" "+a[i]);
break;
}
}
}
输入
25 ,20, 25 ,30, 15, 45, 45, 5
输出
5 45
20 30
25 25
输入
5 ,5 ,45, 45, 45
输出
5 45
答案 2 :(得分:0)
仅打印正确的对时,您无法检查以前的解决方案。您可以将总和为M的a [i]和a [j]添加到数组中。之后,如果新的对摘要提供M,则可以检查数组中是否有元素。
addProductToCart(product) {
this.$store.commit("addProductToCart", product);
this.$toastr("success", "Product added to cart successfully.");
},
答案 3 :(得分:0)
您可以尝试将打印的内容存储在列表中,如果已经打印,则不重复打印。
pip3 install plotly==2.7
答案 4 :(得分:0)
我不会尝试重新发明轮子。只需将每对都放在java.util.Set
中,这样您就可以拥有不同的对:
在最后一个嵌套循环之前添加此代码:
Set<String> pairs = new HashSet<>();
然后将System.out.println(a[i] + " " + a[j]);
更改为pairs.add(a[i] + " " + a[j]);
最后,您可以打印Set的内容。