不知道有没有更好的写法

LowBi 1月前 21

RT.个人项目上的一个问题,写了个例子,自己感觉写的方法较笨。

最新回复 (8)
  • javapythongo 27天前
    引用 2
    你这个算法的时间复杂度是 O(m*n)了,而且在 if(x[i] == y[j])判定相等赋值后,应该直接 break 。
    可以先遍历 y 数组,存储在一个 set 集合中,再遍历 x 数组,原地修改即可,这样子的时间复杂度是 O(m+n)
  • LGA1150 27天前
    引用 3
    int[] x = {1,2,3,4,5,6,7};
    int[] y = {2,4,7};
    int[] z = Arrays.stream(x).map(e -> Arrays.binarySearch(y, e) < 0 ? 0 : e).toArray();
    System.out.println(Arrays.toString(z));
    需要保证 y 有序
  • LGA1150 27天前
    引用 4
    如果像 #1 说的使用集合并原地修改:
    Set<Integer> set = Arrays.stream(y).boxed().collect(Collectors.toSet());
    for (int i = 0; i < x.length; i++) {
    if (!set.contains(x[i])) x[i]=0;
    }
    不用保证 y 有序
  • zjp 27天前
    引用 5
    不假设数组有序和不重复的情况
    int[] x = {1, 2, 3, 4, 5, 6, 7};
    int[] y = {2, 4, 7};
    Map<Integer, Long> count = Arrays.stream(y).boxed()
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    int[] z = Arrays.stream(x).boxed()
    .map(e -> count.containsKey(e) && count.put(e, count.get(e) - 1) > 0 ? e : 0)
    .mapToInt(Integer::intValue).toArray();
    System.out.println("z = " + Arrays.toString(z));
  • zjp 27天前
    引用 6
    @zjp 对 IntStream 不熟悉,boxed 然后 mapToInt 是多余的
  • 楼主 LowBi 27天前
    引用 7
    @javapythongo @LGA1150 @zjp 感谢大佬们提供代码思路
  • no1xsyzy 27天前
    引用 8
    你这判断 a!=0 再 add 跟直接 z.add(a) 有什么区别(

    @LGA1150 你这有序是 O(m log n),m,n>4 的话还不如集合呢……
    有序的情况下最优应是仿归并排序的双指针移动
  • youhuo 27天前
    引用 9
    来学习 学习
  • 游客
    10
返回