java - 我们能否以更简单的方式解决这个 socks 商人问题?

标签 java algorithm

我已经解决了 hackerrank Sock Merchant 问题,但我想降低代码的复杂性(我不确定这是否可能)。

John works at a clothing store. He has a large pile of socks that he must pair by color for sale. Given an array of integers representing the color of each sock, determine how many pairs of socks with matching colors there are.

For example, there are n=7 socks with colors ar= [1,2,1,2,1,3,2]. There is one pair of color 1 and one of color 2. There are three odd socks left, one of each color. The number of pairs is 2.

Function Description

Complete the sockMerchant function in the editor below. It must return an integer representing the number of matching pairs of socks that are available.

sockMerchant has the following parameter(s):

  • n: the number of socks in the pile

  • ar: the colors of each sock

Input Format

The first line contains an integer n, the number of socks represented in ar. The second line contains n space-separated integers describing the colors ar[i] of the socks in the pile.

Constraints

  • 1 <= n <= 100

  • 1 <= ar[i] <= 100 where 0 <= i < n

Output Format

Return the total number of matching pairs of socks that John can sell.

Sample Input

9
10 20 20 10 10 30 50 10 20

Sample Output

3

My solutions :

package com.hackerrank.test;

public class Solution {
    public static void main(String[] args) {
        //Initialize array
        int[] arr = new int[]{10, 20, 20, 10, 10, 30, 50, 10, 20};
        //Array fr will store frequencies of element


        System.out.println("---------------------------------------");
        System.out.println(" sockMerchant output " + sockMerchant(9, arr));
        System.out.println("---------------------------------------");

    }

    static int sockMerchant(int n, int[] ar) {
        int pairs = 0;
        int frequencyArray[] = new int[ar.length];
        int frequencyTemp = -1;
        for (int i = 0; i < ar.length; i++) {
            int count = 1;
            for (int j = i + 1; j < ar.length; j++) {
                if (ar[i] == ar[j]) {
                    count++;
                    frequencyArray[j] = frequencyTemp;
                }
            }
            if (frequencyArray[i] != frequencyTemp) {
                frequencyArray[i] = count;
            }
        }

        for (int i = 0; i < frequencyArray.length; i++) {
            if (frequencyArray[i] != frequencyTemp) {
                int divide = frequencyArray[i] / 2;
                pairs += divide;
            }
        }
        return pairs;
    }
}

输出是:

    ---------------------------------------
    sockMerchant frequency 3
    ---------------------------------------

最佳答案

您可以使用 HashSet 一次性解决此问题 (O(n)) ,其放置和查找时间为O(1)。每个元素都已经在集合中,在这种情况下,它会被删除,并且对计数器会递增,或者不是,在这种情况下,您将添加它:

int[] arr = new int[]{10, 20, 20, 10, 10, 30, 50, 10, 20};

HashSet<Integer> unmatched = new HashSet<>();
int pairs = 0;
for(int i = 0; i < arr.length; i++) {
    if(!unmatched.add(arr[i])) {
        unmatched.remove(arr[i]);
        pairs++;
    }
}

关于java - 我们能否以更简单的方式解决这个 socks 商人问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58960449/

相关文章:

algorithm - sum = x 的数组中的 4 个值

algorithm - 从数组中查找每对整数的绝对差的乘积

java - 如何阻止 HTMLWriter 编写错误的 HTML? (使用 HTMLEditorKit)

algorithm - 从链式哈希表中高效地选择随机元素?

c++ - 二进制搜索树键/值对 - 我知道值但不知道键 C++

java - Hadoop 2.7.2单节点安装windows 10

c++ - 如何使用 C++ 库算法分区函数进行快速排序?

java - Jasper Reports,在 bean 中传递列表/数组

java - 加载数据时忽略 DB2 导入命令中 DAT 文件中的行尾字符

java - 我们可以通过在 java 中创建 upper 来替换 UPPER 函数吗?