标识数组的最小唯一元素

问题描述 投票:0回答:2

允许我强调我是一个初学者,我确信这一事实在我的代码中是显而易见的。

我需要定义一个函数来标识输入数组的最低唯一值(仅出现一次),但是我目前的方法存在缺陷。

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

我首先通过实现嵌套循环将输入数组的值从最高到最低排序。然后,我将所有出现一次以上的所有值设置为零。最后,我确定更改后的数组的最小唯一值并将其返回。如果数组中不存在唯一值,则返回-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},我希望它会重新组织成值[12] = {12、11、8、8、7、6、5、5、4、4、3、3}和6将被返回。

我的代码当前正在返回3。

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

注意:您可以忽略printf行-它们只是在那儿帮助我了解发生了什么

c arrays loops unique minimum
2个回答
1
投票

使用伪代码:

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

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


0
投票

如果将元素重复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;
}
© www.soinside.com 2019 - 2024. All rights reserved.