c - 循环查找不重复的数字

标签 c

我有一个正在开发的 C 程序,它需要在数组中找到第一个非重复数字和最后一个非重复数字。我迷失了如何实现这一目标。任何人都可以帮助我使用循环控制变量来完成这两件事吗?我的循环不断返回一个负数。

这是我的:

for(p = 0; p <= i;p ++ ){
    for(u=p+1;u>=1;u--){
        if(digits[p] > digits[u]);
            firstnon = digits[p];
    }
}

if(firstnon){
    printf("The first non-repeated digit is: %d",firstnon);
}

else{
    printf("There isn't any non-repeated digits");
}    


printf("\n");

for(c=0;c<= sizeof(digits)/sizeof(int);c++){
    for(k=1;k<sizeof(digits);k++){
        if(digits[c]==digits[k]){
            lastnon = digits[k];
        }
    }
}

if(c==k){
    printf("The last non-repeated digit is: %d\n",lastnon);
}

最佳答案

你的代码有一些问题:

  • 这一行:if(digits[p] > digits[u]); 不做我想的那样,看最后一个字符;,这个终止 if 语句的提议。并且以下行不属于 if block 。
  • sizeof(digits) 返回数字的大小(以字节为单位),如果数字的元素不是字节,则您将使用超出范围的索引(使用 k).
  • 我真的不明白如何搜索最后一个非重复数字,当 digits[c] == digits[k] 时,你正在设置 lastnon,我不知道如果我正确理解问题陈述,就认为它是正确的。

这是一个天真的方法:

#include <stdio.h>

int main() {
    int p, u, firstnon = -1, lastnon = -1, digit_repeat;
    int digits[10] = { 1, 2, 3, 1, 3, 5, 1, 2, 4, 3};
    int digits_size = sizeof(digits) / sizeof(digits[0]);

    for (p = 0; p < digits_size; p++) {
        digit_repeat = 0;
        for (u = 0; u < digits_size; u++) {
            if (p != u && digits[p] == digits[u]) {
                digit_repeat = 1;
                break;
            }
        }
        if (!digit_repeat) {
            firstnon = p;
            break;
        }
    }

    if (firstnon != -1) {
        printf("The first non-repeated digit is: %d", digits[firstnon]);
    } else {
        printf("There isn't any non-repeated digits");
    }
    printf("\n");

    for (p = digits_size - 1; p >= 0; p--) {
        digit_repeat = 0;
        for (u = 0; u < digits_size; u++) {
            if (p != u && digits[p] == digits[u]) {
                digit_repeat = 1;
                break;
            }
        }
        if (!digit_repeat) {
            lastnon = p;
            break;
        }
    }

    if (lastnon != -1) {
        printf("The last non-repeated digit is: %d", digits[lastnon]);
    } else {
        printf("There isn't any non-repeated digits");
    }
    printf("\n");
    return 0;
}

找到第一个不重复的数字。

  1. 遍历数字。
  2. 在每个数字中,检查其他数字(所有)在另一个位置的相同数字。
  3. 如果还有,继续
  4. 如果只有一个,保存并中断搜索。

这同样适用于最后的非重复数字,但迭代是相反的。

一些改进版本。

#include <stdio.h>

int main() {
    int p;
    int digits[10] = { 1, 2, 3, 1, 3, 5, 1, 2, 4, 3};
    int digits_size = sizeof(digits) / sizeof(digits[0]);
    int used_digits[10] = { 0 };
    int used_digits_size = sizeof(used_digits) / sizeof(used_digits[0]);

    for (p = 0; p < digits_size; p++) {
        used_digits[digits[p]]++;
    }

    for (p = 0; p < used_digits_size; p++) {
        if (used_digits[p] == 1) {
            printf("The first non-repeated digit is: %d", p);
            break;
        }
    }
    if (p == used_digits_size) {
        printf("There isn't any non-repeated digits");
    }
    printf("\n");

    for (p = used_digits_size - 1; p >= 0; p--) {
        if (used_digits[p] == 1) {
            printf("The last non-repeated digit is: %d", p);
            break;
        }
    }
    if (p == -1) {
        printf("There isn't any non-repeated digits");
    }
    printf("\n");

    return 0;
}

这个版本使用一个数组来存储数字的使用。非重复数字是 usage == 1 的数字。向前和向后搜索以找到第一个和最后一个非重复数字。

关于c - 循环查找不重复的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25549417/

相关文章:

c++ - c和c++上下文中静态、自动、全局和局部变量的区别

c - 如何解析用户的输入以确定在 C 中打印结果的位置?

创建僵尸进程

c - 非常简单的 C 程序不能用 VC 64 编译

c - 我不知道如何更改字符串并在末尾添加更多字符

c - 如何通过api获取扩展的locale信息

c - 访问数组元素时指针的索引

c - 套接字卡在 CLOSE_WAIT 状态

c - 如何从c中的数组中排序日期

c - Xcode 声称 "this"是 C 中的保留语言关键字?