Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 最小唯一数组和_Arrays_Algorithm - Fatal编程技术网

Arrays 最小唯一数组和

Arrays 最小唯一数组和,arrays,algorithm,Arrays,Algorithm,我得到了一个面试问题,我的算法只通过了给定的示例测试用例,并没有通过所有的测试用例 问题:给定一个已排序的整数数组,通过向重复元素添加一些数字以使唯一元素的和最小,返回数组的和,从而使每个元素都是唯一的 即,如果数组中的所有元素都是唯一的,则返回总和。 如果某些元素是重复的,则增加它们以确保所有元素都是唯一的,从而使这些唯一元素的总和最小 一些示例: input1[]={2,3,4,5}=>返回19=2+3+4+5(所有元素都是唯一的,所以只需将它们相加) input2[]={1,2,2}=>

我得到了一个面试问题,我的算法只通过了给定的示例测试用例,并没有通过所有的测试用例

问题:给定一个已排序的整数数组,通过向重复元素添加一些数字以使唯一元素的和最小,返回数组的和,从而使每个元素都是唯一的

即,如果数组中的所有元素都是唯一的,则返回总和。 如果某些元素是重复的,则增加它们以确保所有元素都是唯一的,从而使这些唯一元素的总和最小

一些示例:

  • input1[]={2,3,4,5}
    =>
    返回19
    =2+3+4+5(所有元素都是唯一的,所以只需将它们相加)
  • input2[]={1,2,2}
    =>
    返回6
    =1+2+3(索引2是重复的,所以增加它)
  • input3[]={2,2,4,5}
    =>
    返回14
    =2+3+4+5(索引1是重复的,所以增加它)
这三个是问题中的例子,我的简单算法如下,并通过了给定的三个例子,但没有通过我看不到输入的其他情况

static int minUniqueSum(int[] A) {
    int n = A.length;


    int sum = A[0];
    int prev = A[0];

    for( int i = 1; i < n; i++ ) {
        int curr = A[i];

        if( prev == curr ) {
            curr = curr+1;
            sum += curr;
        }
        else {
            sum += curr;
        }
        prev = curr;
    }

    return sum;
}
还有哪些测试用例和算法可以通过所有用例


有些人抱怨这个问题不清楚。我想让你知道这个问题。没有明确说明添加的数字是否只允许正数或正数和负数。给出三个输入和输出示例,以及一些您不允许看到的其他输入和输出案例,编写一个程序来传递所有其他未看到的输入/输出案例。这就是问题所在。

例如,在重复值较多的情况下,您的算法将失败

二,二,二

你会得到7而不是9

使用您的算法的最小修复是:

static int minUniqueSum(int[] A) {
    int n = A.length;

    int sum = A[0];
    int prev = A[0];

    for( int i = 1; i < n; i++ ) {
        int curr = A[i];

        if( prev >= curr ) {
            curr = prev+1;
        }
        sum += curr;
        prev = curr;
    }

    return sum;
}
static int minUniqueSum(int[]A){
int n=A.长度;
整数和=A[0];
int-prev=A[0];
对于(int i=1;i=当前){
curr=prev+1;
}
总和+=货币;
上一次=当前;
}
回报金额;
}

*正如注释中指出的,无需对已排序的数组进行排序。

如果允许向任何输入添加负值,则最小值仅为第N个三角形数,其中N是数组中的元素数。(我假设我们只处理调整后数组的正数,因为我们可以使它任意小(负数)

因此,您的算法只是寻找一对相同的连续值。如果未找到,则返回总和else
N*(N+1)/2


相反,如果只有重复的元素可以调整,那么方法是在连续元素之间找到漏洞,并用以前“排队”的值填充它们元素是不相关的,只需要一个计数器。下面是一个C#解决方案,我假设对元素的调整必须是正值。这意味着我们不能倒退并填补未使用的漏洞,从而简化了问题

int F()
{
    int[] a = {2, 2, 2, 3, 8, 9}; // sorted list

    int n = 0; /* num */   int p = 0; /* prev; zero is an invalid value in the list */
    int q = 0; /* queue */ int s = 0; /* sum */

    for (int i = 1; i < a.Length; i++)
    {
        n = a[i];
        if (n == p)
            q++; // increment queue on duplicate number
        else
        {
            // for every hole between array values, decrement queue and add to the sum
            for (int j = 1; q > 0 && j < n - p; j++, q--)
                s += p + j;
            s += (p = n);
        }
    }
    // flush the queue
    for (; q > 0; q--)
        s += ++n;

    return s;
}
在这里尝试这两种方法:

inta[]={1,2,2,3,5,6,6,6};那么数组中的元素和是什么呢
根据上述问题陈述,它将是{1,2,3,4,5,6,7,8,9}
解决方案
公共静态无效唯一和(){
int a[]={1,2,2,3,5,6,6,6,6};
int n=a.长度;
整数和=a[0];
int-prv=a[0];

对于(inti=1;i您可以尝试以下代码

int a[] = {1, 1 , 1};
ArrayList<Integer> arr = new ArrayList<Integer>();
HashMap hash = new HashMap();
for(int i=0;i<a.length;i++){
    arr.add(a[i]);
}
int sum = 0;
hash.put(0, arr.get(0));
sum = (int) hash.get(0);
for(int i=1;i<arr.size();i++){
    for(int j=1;j<=a.length;j++){
        if(hash.containsValue((arr.get(i)))){
            arr.set(i, arr.get(i)+1);
        }else{
            hash.put(i, arr.get(i));
            sum += (int) hash.get(i);
            break;
        }
    }
}

System.out.println(sum);
inta[]={1,1,1};
ArrayList arr=新的ArrayList();
HashMap hash=新的HashMap();
对于(inti=0;ipublicstaticintminsum(intarr[]){


for(int i=0;i在java中使用集合有很大帮助,
这里我使用HashMap,因为它存储每个唯一键的值

hashmap中的键是数组元素,值是数组中出现的计数数

package uniquesum;
import java.util.*;
public class Uniquesum {
static HashMap<Integer, Integer> hp = new HashMap<Integer, Integer>();
    static int Sum(int arr[]){
        int sum=0;
        Arrays.sort(arr);
        hp.put(arr[0], 1);
        for(int i=1; i<arr.length; i++){
            if(hp.containsKey(arr[i])){

                Integer val = hp.get(arr[i]);
                hp.put(arr[i], val+1);
                hp.put(arr[i]+val, 1);                
            }
            else{
                hp.put(arr[i], 1);
            }
        }

        for(Map.Entry m:hp.entrySet()){
            sum = sum + (int)m.getKey();
        }
        return sum;
    }
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int arr[] = new int [n];
        for(int i=0; i<n;i++){

        arr[i] = scan.nextInt();
        }

        System.out.println("Sum is " + Sum(arr));


    }

}
package uniquesum;
导入java.util.*;
公共类唯一金额{
静态HashMap hp=newhashmap();
静态整数和(整数arr[]{
整数和=0;
数组。排序(arr);
hp.put(arr[0],1);

对于(inti=1;i我喜欢这样,没有排序

    // Complete the getMinimumUniqueSum function below.
static int getMinimumUniqueSum(int[] arr) {

 int sum = 0;

 ArrayList < Integer > arrayList = new ArrayList < Integer > (arr.length);

 arrayList.add(arr[0]);


 for (int i = 1; i < arr.length; i++) {

  int val = arr[i];

  while (arrayList.contains(val)) {

   val++;
  }

  arrayList.add(val);

 }



 for (int i = 0; i < arrayList.size(); i++) {
  sum += arrayList.get(i);
 }

 return sum;
}
//完成下面的getMinimumUniqueSum函数。
静态int getMinimumUniqueSum(int[]arr){
整数和=0;
ArrayListArrayList=新的ArrayList(arr.length);
arrayList.add(arr[0]);
对于(int i=1;i

它通过了所有(13)个测试用例。

根据您对隐藏I/O的描述,这可能是一个HackerRank测试问题。更好的说明问题的方法是“给定一个排序的数字数组,通过以最小化数组和的方式递增(一次递增num+)使数字不同。”

该问题只允许递增,即一次将一个数字增加1。这也确保数组始终保持排序。 所以{1,2,4,4,7,7,8}-->{1,2,4,5,7,8,9}

这就是解决方案的问题所在。 工作解决方案(JAVA 7) :

public static int getMinimumUniqueSum(列表arr){
int sum=0,val=0;
ArrayListArrayList=新的ArrayList(arr.size());
arrayList.add(arr.get(0));
对于(int i=1;i
在JavaScript中

var list = [1, 1, 1, 10, 3, 2];

function minUniqueSum(arr) {
  const temp = arr.reduce((acc, cur) => {
    while (acc.includes(cur)) cur++;
    acc.push(cur);
    return acc;
  }, []);
  console.log(temp); // [1, 2, 3, 10, 4, 5]
  return temp.reduce((acc, cur) => acc + cur, 0);
}

var result = minUniqueSum(list);
console.log(result); // 25

虽然此解决方案基于java,但思维过程可以应用于任何地方

您的解决方案几乎是正确和优化的。使用多个for循环将大大降低速度,因此,如果
    for(int i=0; i<arr.length-1;i++){

        if(arr[i]==arr[i+1]){

            arr[i+1]= arr[i+1]+1;
        }
    }

    int sum=0;

    for(int i=0; i<arr.length;i++){

        sum=sum+arr[i];
    }

    System.out.println("sum: "+sum);
    return sum;
}
package uniquesum;
import java.util.*;
public class Uniquesum {
static HashMap<Integer, Integer> hp = new HashMap<Integer, Integer>();
    static int Sum(int arr[]){
        int sum=0;
        Arrays.sort(arr);
        hp.put(arr[0], 1);
        for(int i=1; i<arr.length; i++){
            if(hp.containsKey(arr[i])){

                Integer val = hp.get(arr[i]);
                hp.put(arr[i], val+1);
                hp.put(arr[i]+val, 1);                
            }
            else{
                hp.put(arr[i], 1);
            }
        }

        for(Map.Entry m:hp.entrySet()){
            sum = sum + (int)m.getKey();
        }
        return sum;
    }
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int arr[] = new int [n];
        for(int i=0; i<n;i++){

        arr[i] = scan.nextInt();
        }

        System.out.println("Sum is " + Sum(arr));


    }

}
    // Complete the getMinimumUniqueSum function below.
static int getMinimumUniqueSum(int[] arr) {

 int sum = 0;

 ArrayList < Integer > arrayList = new ArrayList < Integer > (arr.length);

 arrayList.add(arr[0]);


 for (int i = 1; i < arr.length; i++) {

  int val = arr[i];

  while (arrayList.contains(val)) {

   val++;
  }

  arrayList.add(val);

 }



 for (int i = 0; i < arrayList.size(); i++) {
  sum += arrayList.get(i);
 }

 return sum;
}
public static int getMinimumUniqueSum(List <Integer> arr){
    int sum = 0, val = 0;
    ArrayList < Integer > arrayList = new ArrayList < Integer > (arr.size());
    arrayList.add(arr.get(0));
    for (int i = 1; i < arr.size(); i++) {
        val = arr.get(i);
        while (arrayList.contains(val)) {
            val++;
        }
        arrayList.add(val);    
    }
    for (int i = 0; i < arrayList.size(); i++) {
        sum += arrayList.get(i);
    }
    return sum;
}
var list = [1, 1, 1, 10, 3, 2];

function minUniqueSum(arr) {
  const temp = arr.reduce((acc, cur) => {
    while (acc.includes(cur)) cur++;
    acc.push(cur);
    return acc;
  }, []);
  console.log(temp); // [1, 2, 3, 10, 4, 5]
  return temp.reduce((acc, cur) => acc + cur, 0);
}

var result = minUniqueSum(list);
console.log(result); // 25
 public static double calculateMinSumSorted(int[] input){
    double sum = input[0];

    long prev = input[0];
    long cur;

    for(int i = 1 ; i < input.length ; i++){
        cur = input[i];
        if(cur <= prev){
            cur = ++prev;
        }
        prev = cur;
        sum += cur;
    }
    return sum;
}
@Test
public void testSimpleArray(){
    double test1 = muas.calculateMinSumSorted(new int[]{1,2,3,4});
    Assert.assertEquals(10, test1, 0.1);

}
@Test
public void testBeginningSameValues(){
    double test1 = muas.calculateMinSumSorted(new int[]{2,2,3,4});
    Assert.assertEquals(14, test1, 0.1);
}
@Test
public void testEndingSameValues(){
    double test1 = muas.calculateMinSumSorted(new int[]{1,2,4,4});
    Assert.assertEquals(12, test1, 0.1);
}
@Test
public void testAllSameValues(){
    double test1 = muas.calculateMinSumSorted(new int[]{1,1,1,1});
    Assert.assertEquals(10, test1, 0.1);
}

@Test
public void testOverMaxIntResult(){
    double test1 = muas.calculateMinSumSorted(new int[]{1,2,3,3,4,4,4,4,4,Integer.MAX_VALUE});
    System.out.println(test1);
    Assert.assertEquals(2147483692.0, test1, 0.1);
}

@Test
public void testDoubleMaxIntArray(){
    double test1 = muas.calculateMinSumSorted(new int[]{2,2,3,4,5,6,7,8,9, Integer.MAX_VALUE, Integer.MAX_VALUE});
    Assert.assertEquals(4294967349.0, test1, 0.1);
}

@Test
public void testDoubleMinIntArray(){
    double test1 = muas.calculateMinSumSorted(new int[]{Integer.MIN_VALUE, Integer.MIN_VALUE,2,2,3,4,5,6,7,8,9});
    Assert.assertEquals(-4294967241.0, test1, 0.1);
}
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

/* No sorting required. Works even with random list */
public static int getMinUniqueSum(List<Integer> list)
    {
        Set<Integer> set = new HashSet<Integer>();

        int sum = 0;

        for (Integer val : list) 
        {
            if(!set.add(val))
            {
                while(true)
                {
                    Integer temp = val + 1;
                    if(set.add(temp))
                    {
                        sum = sum + temp;
                        break;
                    }
                }
            }
            else
            {
                sum = sum + val;
            }
        }

        return sum;
    }

    public static void main(String[] args) 
    {
        Scanner s = new Scanner(System.in);

        System.out.println("Enter size of the list");

        int n = s.nextInt();

        List<Integer> list = new ArrayList<Integer>(n);

        System.out.println("Enter " + n + " elements of the list");

        for(int i = 0; i < n; i++)
            list.add(s.nextInt());

        s.close();

        System.out.println("MinUniqueSum = " + getMinUniqueSum(list));

    }
}
countdups _ _  [] = []
countdups first prev (x:xs)             
        | (prev >= x) && (first /= True) = (prev+1) : countdups False (prev+1)  xs 
        | otherwise = x: countdups False x xs

minsum list =  sum $ countdups True 0 (sort list)
[2,3,4,5]

minsum = 14 
[1,2,3]

minsum = 6
[2,3,4,5]

minsum = 14
[1,2,3,4,7]

minsum = 17
[1,2,3,4,5,10]

minsum = 25
[1,2,3,4]    

minsum= 10
[1,2,3,4,5,6,7,8,9,2147483647]

minsum= 2147483692