我们可以用更少的复杂性解决这个袜子商人的问题吗?

时间:2019-11-20 17:45:47

标签: java algorithm

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

  约翰在一家服装店工作。他有一堆袜子,必须按颜色配对以出售。给定代表每个袜子颜色的整数数组,确定有多少双颜色匹配的袜子。

     

例如,有 n = 7 袜子,颜色为 ar = [1,2,1,2,1,3,2] 。有一对颜色 1 和一种颜色 2 。剩下三只奇怪的袜子,每种颜色一只。对数为2。

     

功能描述

     

在下面的编辑器中完成sockMerchant函数。它必须返回一个整数,表示可用的匹配的袜子对数。

     

sockMerchant具有以下参数:

     
      
  • n:一堆袜子的数量

  •   
  • ar:每只袜子的颜色

  •   
     

输入格式

     

第一行包含整数 n ,以 ar 表示的袜子数。   第二行包含 n 个以空格分隔的整数,它们描述了桩中袜子的颜色 ar [i]

     

约束

     
      
  • 1 <= n <= 100

  •   
  • 1 <= ar [i] <= 100,其中0 <= i

  •   
     

输出格式

     

返回John可以出售的匹配袜子的总数。

     

样本输入

9
10 20 20 10 10 30 50 10 20
  

样本输出

3
  
     

我的解决方案:

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
    ---------------------------------------

22 个答案:

答案 0 :(得分:2)

您可以使用HashSetO(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++; } } 放置和查找时间。每个元素都已经在集合中,在这种情况下,它会被删除,并且对计数器会增加,或者不是,在这种情况下,您可以添加它:

 void calculateBalanceValue(BinaryNode *& t)
        {
            if (t==nullptr) return;

            int left = height(t->left);
            int right = height(t->right);
            t->bal=abs(left -right);
            calculateBalanceValue(t->right);
            calculateBalanceValue(t->left);

        }

答案 1 :(得分:1)

这是我的简单代码,供初学者使用 c++ 理解,它打印用户定义向量中的对数计数:

#include <bits/stdc++.h>

using namespace std;

vector<string> split_string(string);

// Complete the sockMerchant function below.
int sockMerchant(int n, vector<int> ar) {
  int count=0;
  vector<int> x;
  for(int i=0;i<n;i++){
    if(ar[i]!=0)
    {
      for(int j=i+1;j<n;j++)
        {
          if(ar[i]==ar[j]){
            count++;
            ar[j]=0;
            break;
        }
    }}
  }
  return count;
}

int main()
{
  int a,b;
  vector<int> v;
  cin>>a;
  for(int i=0;i<a;i++){
    cin>>b;
    v.push_back(b);
    
  }
  cout<<sockMerchant(a,v);
}

答案 2 :(得分:0)

这个问题可以通过哈希集轻松解决。我们可以利用 HashSet 不存储重复元素的能力。这是下面的代码。

    Set<Integer> set = new HashSet<>();
    int pairCount = 0;
    for(int i = 0; i < arr.length; i++) {
        if(set.add(a[i])
           set.add(a[i])
        else {
           pairCount++; 
           set.remove(a[i]);
        }
    }
    return pairCount;

答案 3 :(得分:0)

使用 Python 3:

def sockMerchant(n, ar):

    flag = 0
    for i in range(n):
        if ar[i:].count(ar[i])%2==0:
            flag+=1
    return flag

答案 4 :(得分:0)

它也可以使用内置的 Set 数据类型来解决,如下(我的尝试)-

function sockMerchant(n, ar) {
    // Write your code here
    let numberSet = [...new Set(ar)];
    let pairs = 0;
    for(let i=0;i<numberSet.length;i++){
        let count = 0;
        ar.filter(x => {
           if(x == numberSet[i])
               count++;
        });
        pairs+= count / 2 >= 1 ? Math.trunc(count / 2) : 0;
    }
    return pairs;
}

答案 5 :(得分:0)

我喜欢的更简单的方法。 Kotlin 中的答案

var counter = 0
for (i in 0 until n) {
    if (arr[i] != 0) {
        loop@ for (j in i + 1 until n) {
            if (arr[i] == arr[j]) {
                counter++
                arr[j] = 0
                break@loop
            }
        }
    }
}

评论更好的编程

答案 6 :(得分:0)

你可以计算一个数字在列表中出现的次数并除以2

def sockMerchant(n, ar):
     unq = set(ar)
     count = 0
     for i in unq:
      count_vals = ar.count(i)
      if count_vals>1:
        count = count + int(count_vals/2)
     return count

答案 7 :(得分:0)

function sockMerchant(n, ar) {
  //Need to initiate a count variable to count pairs and return the value
  let count = 0
  //sort the given array
  ar = ar.sort()
  //loop through the sorted array 
  for (let i=0; i < n-1; i++) {
    //if the current item equals to the next item 
    if(ar[i] === ar[i+1]){
      //then that's a pair, increment our count variable
      count++
      //also increment i to skip the next item
      i+=1
    }
  }
  //return the count value
  return count
}

sockMerchant(9, [10, 20, 20, 10, 10, 30, 50, 10, 20])

答案 8 :(得分:0)

Javascript 代码

const set = new Set()
let count = 0;

for(let i = 0; i < i; i++) {
    if (set.has(ar[i])) {
        count++;
        set.delete(ar[i])
    } else {
        set.add(ar[i])
    }
}

答案 9 :(得分:0)

我想用数组来解决这个问题。这是我在 HackerRank (Java 8) 上解决 Sock Merchant 问题的解决方案:

.... 导入 org.apache.commons.lang3.ArrayUtils; 导入 java.util.Arrays;

类结果{

public static int sockMerchant(int n, List<Integer> ar) {

int[] arr = ar.stream().mapToInt(i->i).toArray();

int counter = 0;

for(int i = 0; i<n; i++) {
    if(arr[i]>0) {
        int t = arr[i];
        arr[i] = -1;
        int j = ArrayUtils.indexOf(arr, t);
        if(j == -1) {
            continue;
        } else {
            arr[j] = -1;
            counter += 1;
        }
    } else {
        continue;
    }
}

return counter;    

}

}

时间复杂度为 O(n)。

答案 10 :(得分:0)

My answer in C
        int sockMerchant(int n, int ar_count, int* ar) {
        int matchcounter =0;// each number repeating count
        int paircounter=0;//total pair
        int size=0;int i,j,k;
        bool num_av=false;//number available or not in new array
        int numberarray[n];//creating new (same length) array of length n
       for(i=0;i<n;i++){
          num_av=false;
          for(k=0;k<=size;k++){
            if(numberarray[k] == ar[i]){
              num_av=true;
              break;  
            }
          }
          if(!num_av){
                size+=1;
                numberarray[size-1]=ar[i];
                for(j=0;j<n;j++){
                    if(ar[i]==ar[j]){
                        matchcounter++;
                    }
                }
                paircounter += matchcounter/2;
                matchcounter=0;
          }
           
       }
       return paircounter;
    }

答案 11 :(得分:0)

/*
 * Complete the 'sockMerchant' function below.
 *
 * The function is expected to return an INTEGER.
 * The function accepts following parameters:
 *  1. INTEGER n
 *  2. INTEGER_ARRAY ar
 */

function sockMerchant(n, ar) {
    // Write your code here    
    let count = [];
    for (var i = 0; i < ar.length; i++) {
        if (count.hasOwnProperty(ar[i])) {
            count[ar[i]]++;
        }
        else {
            count[ar[i]] = 1;
        }
    }
    
    let number = 0;
    for (const key in count) {
        number += parseInt(count[key] / 2);
    }
    return number;
}

答案 12 :(得分:0)

package com.java.example.sock;

import java.io.IOException;
/**
 * 
 * @author Vaquar Khan
 *
 */
public class Solution1 {

// Complete the sockMerchant function below.
    /*
     * 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  socks with colors . There is one pair of color  and one of color . There are three odd socks left, one of each color. The number of pairs is .
     */
    static int sockMerchant(int n, int[] ar) {

        int counter = 0;
        int count = 0;
        //
        for (int i = 0; i < ar.length; i++) {
            count = 1;
            //
            for (int j = i + 1; j < ar.length; j++) {
                if (ar[i] == ar[j]) {
                    count++;
                }
            }

            if (count % 2 == 0) {
                counter++;
            }
        }

        return counter;
    }

    public static void main(String[] args) throws IOException {

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

        System.out.println(sockMerchant(9, array));
    }
}

答案 13 :(得分:0)

我们可以使用哈希表。由于哈希表的复杂度为 O(1)
看看下面的代码片段,我在 python 中创建了一个字典,即具有键和值的哈希表。在字典中,每个值只存在一个唯一的 Key。因此,在开始时字典将为空。我们将遍历提供的列表并检查字典键中的值。如果该值不在字典键中,则表示它是唯一的,请将其添加到字典中。如果我们在字典键中找到值,只需增加 pairs counter 并从哈希表即字典中删除该键值对。

def sockMerchant(n, ar):
    hash_map = dict()
    pairs = 0
    for x in range(len(ar)):
        if ar[x] in hash_map.keys():
            del hash_map[ar[x]]
            pairs += 1
        else:
            hash_map.setdefault(ar[x])
    return pairs

答案 14 :(得分:0)

这适用于 Java 8!!

static int sockMerchant(int n, int[] ar) {
        Set<Integer> list = new HashSet<Integer>();
        int count = 0;
        for(int i= 0; i < n; i++){
            if(list.contains(ar[i])){
                count++;
                list.remove(ar[i]);
            }
            else{
                list.add(ar[i]);
            }
        }
        return count;
    }

答案 15 :(得分:0)

def sockMerchant(n,ar):

socks = dict()
pairs = 0
for i in ar:
    if i in socks:
        socks[i] = socks[i]+1
    if i not in socks:
        socks[i] = 1
    if socks[i]%2 == 0:
        pairs += 1

return pairs  

答案 16 :(得分:0)

Python 3的代码

n = 9
ar = [10, 20, 20, 10, 10, 30, 50, 10, 20]
def sockMerchant(n, ar):
    totalpair = 0
    test= list(set(ar))
    for i in test:
        pair = 0
        for j in ar:
            if i==j:
                pair+=1
        if pair>=2:
            totalpair=totalpair+int(pair/2)
    return totalpair
print(sockMerchant(n,ar))

答案 17 :(得分:0)

static int sockMerchant(int n, int[] ar) {
    int pairs = 0;
    for (int i = 0; i < ar.length; i++) {
        int counter = 0;
        for (int j = 0; j < ar.length; j++) {
            if (j < i && ar[j] == ar[i]) break;
            if(ar[j]==ar[i]) counter++;
        }
        pairs+=counter/2;
    }
    return pairs;
}

答案 18 :(得分:0)

使用字典解决问题的Py3

def sockMerchant(n, ar):
    pair = 0
    d = {}
    for i in ar:
        if i in d:
            d[i] += 1
        if i not in d:
            d[i] = 1
    print(d)
    for x in d:
        u = d[x]//2
        pair += u
    return pair

答案 19 :(得分:0)

Refer below one using HashMap and having complexity O(1)

static int sockMerchant(int n, int[] ar) {
        int pairs=0;
        Map<Integer, Integer> map = new HashMap<>();
        for(int i=0;i<n;i++){
            if(map.containsKey(ar[i])){
                int count=map.get(ar[i]);
                map.put(ar[i],++count);
            }
            else{
                map.put(ar[i],1);
            }
        }
        for(int i : map.values()){
            pairs=pairs+(i/2);
        } 
        return pairs;

    }

答案 20 :(得分:0)

这是我用JAVA在HackerRank上进行Sock Merchant测试的解决方案

import java.io.*;
import java.util.*;

public class sockMerchant {

public static void main(String[] args) {
    Scanner en = new Scanner(System.in);
    int n=en.nextInt();
    int[] hash = new int[300];
    for(int i=0; i<n; i++){
        hash[en.nextInt()]++;
    }
    long res=0;
    for(int f: hash){
        res+=f/2;
    }
    System.out.println(res);
 }
}

答案 21 :(得分:-1)

是的,您可以将其复杂度降低为O(n)。只需迭代一次输入数组,然后为找到的每个新元素在哈希图中创建一个值为1的条目。如果找到重复的条目,请在映射中将该条目的值递增。

完成传递后,迭代映射中的项目,将其值除以2,仅保留除法的整数部分,然后加上累加和。