我有一个正在开发的 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;
}
找到第一个不重复的数字。
- 遍历数字。
- 在每个数字中,检查其他数字(所有)在另一个位置的相同数字。
- 如果还有,继续
- 如果只有一个,保存并中断搜索。
这同样适用于最后的非重复数字,但迭代是相反的。
一些改进版本。
#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/