2014-08-28 67 views
0

我有一个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); 
} 
+0

你的意思是“不重复”是什么意思?你可以添加一个例子吗?例如。 “12321”中第一个不重复的数字是什么?我可以想象“1”,因为它不是立即重复,或“3”,因为它是第一个数字只发生一次。 – Medo42 2014-08-28 13:06:29

+0

“digits”的声明和初始化是什么?他们是字符还是数字? – 2014-08-28 13:13:15

+0

仅在数组中找到一次的数字。在2,6,6,3,3,4的数组中将是第一个不重复的,并且4将是最后的 – mcliatt 2014-08-28 13:14:11

回答

2

在代码中的一些问题:

  • 这条线:if(digits[p] > digits[u]);不要做你所期望的,我认为,看到最后一个字符;,这杀了if声明的建议。并且以下行不属于if块。
  • sizeof(digits)这个sizeof(digits)返回数字的大小(以字节为单位),如果数字的元素不是字节,那么您将索引带有出界索引的数组(with k)。
  • 我真的不明白搜索最后一个非重复数字,你在设置lastnondigits[c] == digits[k],如果我正确理解了问题陈述,我认为它不正确。

这里是一个天真的做法:

#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的数字。向前搜索并向后查找第一个和最后一个非重复数字。

+0

非常感谢您的帮助 – mcliatt 2014-08-28 14:11:37