【问题标题】:Identify minimum unique element of array识别数组的最小唯一元素
【发布时间】:2020-02-22 20:10:42
【问题描述】:

请允许我强调一个事实,即我是一个初学者,我确信这一事实在我的代码中很明显。

我需要定义一个函数来识别输入数组的 LOWEST UNIQUE(仅出现一次)值,但是我目前的方法是有缺陷的。

我认为我正在努力整合问题的各个方面。

我首先通过实现嵌套循环将输入数组的值从最高到最低排序。然后我继续将所有出现多次的值设置为零。最后,我确定更改后的数组的最小唯一值并将其返回。如果数组中不存在唯一值,则返回-1。

我被允许假设输入数组的每个元素都是正数且大于零,并且其长度至少为 1。

int minUnique(int *values, int length)

{

int i, j, temp, min = values[0];

for (i = 0; i < length; i++) {           /* sorting */
            for (j = 0; j < length - 1; j++) {
                if (values[j] < values[j +1]) {
                    temp = values[j + 1];
                    values[j + 1] = values[j];
                    values[j] = temp;               
                }
            }
        }

        for (i = 0; i < length; i++) {        
            printf(" %d", values[i]);
        }
        for (i = 0; i < length; i++) {          /* setting 0 */
            if (values[i] == values[i + 1]) {
                values[i] = 0;
                values[i + 1] = 0;
            }
        }
       for (i = 0; i < length; i++) {        
            printf("  %d", values[i]); 
    }
    for (i = 1; i < length - 1; i++) {          /* identifying min */
        if ((values[i] < min) && (values[i] != 0)) {
            min = values[i];
        } else {
            count++;
            } 
        } if (count == length) {
            return -1; 
    } else {
        return min;
    }
}

如果我输入一个数组,例如 values[12] = {3, 7, 5, 6, 3, 4, 8, 4, 5, 8, 12, 11},我希望它被重组为values[12] = {12, 11, 8, 8, 7, 6, 5, 5, 4, 4, 3, 3} 和 6 要返回。

我的代码目前返回 3。

代码未生成任何错误消息。

注意:您可以忽略 printf 行 - 它们只是为了帮助我了解正在发生的事情

【问题讨论】:

    标签: c arrays loops unique minimum


    【解决方案1】:

    在伪代码中:

    1. Sort from lowest to highest.
    2. Iterate over the sorted array and return the first element whose neighbors are different.
    

    第一步可以使用qsort()标准库函数来完成。

    【讨论】:

    • @Hsch2606:如果将数组从低到高排序,则第一个元素是最小元素。
    【解决方案2】:

    如果元素重复 3 次(或任何奇数次),则将重复元素设置为零的代码不起作用

    此外,您可以按照从低到高的顺序对数组进行排序。删除任何重复项后的第一个非零元素将是您的答案。

    完整代码如下。

    #include <stdio.h>
    int minUnique(int *values, int length)
    {
      int i, j, temp;
      for (i = 0; i < length; i++) {           
        /* sorting */
        for (j = 0; j < length - 1; j++) {
          if (values[j] > values[j +1]) {
            temp = values[j + 1];
            values[j + 1] = values[j];
            values[j] = temp;               
          }
        }          
      }  
      for (i = 0; i < length; i++) {        
        printf(" %d", values[i]);
      }
    
      i=0;                              // Remove Duplicates
      while (i < length)
      {
        j=1;
        int dup = 0;
        while (values[i] == values[i+j])
        {
          values[i+j] = 0;
          dup = 1;
          j++;
        }
        if (dup == 1)
          values[i] = 0;
        i = i+j;  
      }
      printf ("\n"); 
      for (i = 0; i < length; i++) {        
        printf("  %d", values[i]); 
      }
    
      for (i = 0; i < length; i++) {          /* identifying min */
        if (values[i] != 0)
        {
          return (values[i]);
        }
      }
      return (-1); // no duplicates
    }  
    
    int main(void)
    {
      int arr[] = {3, 7, 5, 6, 3, 3, 8, 4, 5, 8, 12, 11};
      int min = minUnique(arr, sizeof(arr)/sizeof(arr[0]));
      printf ("\nMinimum is %d\n",min);
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2021-09-15
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2017-03-27
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多