识别数组的最小唯一元素
Identify minimum unique element of array
请允许我强调一个事实,即我是一个初学者,我确信我的代码中很明显这一事实。
我需要定义一个函数来标识输入数组的最低唯一(仅出现一次)值,但是我当前的方法存在缺陷。
我认为我正在努力整合问题的各个方面。
我首先通过实施嵌套循环对输入数组的值从高到低进行排序。然后,我继续将出现不止一次的所有值设置为零。最后,我确定了更改数组的最小唯一值并将其 return 。如果数组中不存在唯一值,则 I return -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 为 returned。
我的代码目前正在 returning 3。
代码未生成任何错误消息。
注意:您可以忽略 printf 行 - 它们只是帮助我了解正在发生的事情
在伪代码中:
1. Sort from lowest to highest.
2. Iterate over the sorted array and return the first element whose neighbors are different.
第一步可以使用qsort()
标准库函数完成。
如果元素重复 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;
}
请允许我强调一个事实,即我是一个初学者,我确信我的代码中很明显这一事实。
我需要定义一个函数来标识输入数组的最低唯一(仅出现一次)值,但是我当前的方法存在缺陷。
我认为我正在努力整合问题的各个方面。
我首先通过实施嵌套循环对输入数组的值从高到低进行排序。然后,我继续将出现不止一次的所有值设置为零。最后,我确定了更改数组的最小唯一值并将其 return 。如果数组中不存在唯一值,则 I return -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 为 returned。
我的代码目前正在 returning 3。
代码未生成任何错误消息。
注意:您可以忽略 printf 行 - 它们只是帮助我了解正在发生的事情
在伪代码中:
1. Sort from lowest to highest.
2. Iterate over the sorted array and return the first element whose neighbors are different.
第一步可以使用qsort()
标准库函数完成。
如果元素重复 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;
}