一个算法实现

tianfang 2021-02-24 07:37:36
问题: 两个包含6个整数的数组,比较有几个相同的整数

追求最高性能,昨天花了几个小时做改进,发现做起来非常简单,大家来试试吧
...全文
266 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2021-02-27
  • 打赏
  • 举报
回复
引用 6 楼 tianfang 的回复:
看看是不是非常简单
简单是简单,利用归并排序的思想(其实就是两个数组同时循环),不过有个局限,就是两个数组都是事先排序好的。 而常见方法就没有事先排好序这个局限,而且两个数组同时循环一样适用 public int sameRed(byte[] src, byte[] target) { int same = 0; int[] nums = new int[50]; //假设双色球最大号码是50 for (int i=0; i<src.length; i++) { if (nums[(int)src[i]] == 1) { same++; } nums[(int)src[i]] = 1; if (nums[(int)target[i]]==1) { same++; } nums[(int)target[i]] = 1; } return same; }
tianfang 2021-02-26
  • 打赏
  • 举报
回复
引用 5 楼 qybao 的回复:
如果是双色球这样的问题,那数字就不会很大,可以考虑用空间换取时间(这是常见的方法)


	public int sameRed(byte[] src, byte[] target) {
		int same = 0;
		int ca = 0, cb = 0;
		while (cb < 6 & ca < 6) {

			if (src[ca] < target[cb]) {
				ca++;

			} else if (src[ca] > target[cb]) {
				cb++;

			} else {
				same++;
				cb++;
				ca++;
			}

		}

		return same;
	}
看看是不是非常简单
tianfang 2021-02-25
  • 打赏
  • 举报
回复
引用 3 楼 KeepSayingNo 的回复:
每个数组里面允许有相同的数吗,如果没有,那就比较好做。直接将其分别扔到set里面,然后两个set取交集
哈 ,实际案例是双色球的红球,之前的算法就是使用hashset,效率不够高

	public int sameRed(byte[] src, byte[] target) {
		int same = 0;
		Set<Byte> cachedSet = new HashSet<Byte>();

		for (byte by : src) {
			cachedSet.add(by);
		}

		for (byte by : target) {
			if (cachedSet.contains(by)) {
				same++;
			}
		}
		return same;
	}
KeepSayingNo 2021-02-25
  • 打赏
  • 举报
回复
每个数组里面允许有相同的数吗,如果没有,那就比较好做。直接将其分别扔到set里面,然后两个set取交集
qybao 2021-02-25
  • 打赏
  • 举报
回复
如果是双色球这样的问题,那数字就不会很大,可以考虑用空间换取时间(这是常见的方法)
public int sameRed(byte[] src, byte[] target) {
    int same = 0;
    int[] nums = new int[50]; //假设双色球最大号码是50
 
    for (byte by : src) {
        nums[(int)by] = 1;
    }
 
    for (byte by : target) {
        if (nums[(int)by] == 1) {
            same++;
        }
    }
    return same;
}
tianfang 2021-02-24
  • 打赏
  • 举报
回复
补充一点,两个数组已经按从小到大排序完成
qybao 2021-02-24
  • 打赏
  • 举报
回复
用集合的交并差就好 for example
public class Sample {
  public static void main(String[] args) {
    int[] num1 = {1, 2, 3, 8, 9, 5};
    int[] num2 = {2, 3, 4, 5, 6, 7};
    
    List<Integer> l1 = new ArrayList<>();
    List<Integer> l2 = new ArrayList<>();
    for (int n : num1)
      l1.add(n);
    for (int n : num2)
      l2.add(n);

    l1.retainAll(l2); // 两个集合的交集
    System.out.println(l1);

  }
}

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧