【问题标题】:Checking array for identical numbers and their value检查数组是否有相同的数字及其值
【发布时间】:2016-01-27 11:59:57
【问题描述】:

作为我必须编写的程序的一部分,我需要编写的函数之一应该检查数组是否有任何相同的相同数字,以及其中一个是否大于/等于给定数字.

给定的数字也是数组中数字的数量

这是我目前所拥有的:

int checkarray(int *arr, int num)
{
    int check = num;
    int check2 = num;
    int *lor;
    int *poi;
    int *another;

    another = arr;
    lor = arr;
    poi = arr;
    int check3 = num;

    for ( ; num > 1; num--) {

        for ( ; check3 >= 0; check3--) {

            if (*arr == *poi)
                return 0;
            poi++;
        }
        arr++;
        poi = another;
    }

    for ( ; check2 > 0; check2--) {

        if (*lor >= check)
            return 0;
        lor++;
    }
    return 1;
}

我知道我为函数创建了太多指针/int,但这不是问题..

如果我没记错的话,检查给定值的部分可以正常工作,所以我认为你可以忽略该部分(这是最后一个“for”循环)

我知道这应该很容易,但由于某种原因我无法让它工作......

编辑:

我举个例子:如果数组是 0 1 2 3 1,函数将返回 0,因为第二个和最后一个数字是相同的。如果给定数字是 5,并且其中一个数字大于或等于 5,例如 0 1 2 5 4,该函数也将返回 0。

否则,函数返回 1。

【问题讨论】:

  • 你的问题不清楚。 “数组具有相同的任何相同数字,并且其中一个数字更大/等于给定数字”是什么意思。
  • 我举个例子:如果数组是 0 1 2 3 1 函数将返回 0,因为第二个和最后一个数字是相同的。如果给定数字是 5,并且其中一个数字大于或等于 5,则该函数也将返回 0,例如 0 2 3 4 5
  • 我格式化了你的代码。现在可能更容易找到问题..
  • 请不要使用l(小写L)作为变量名。它看起来太像数字1。您必须非常仔细地查看int check3 = l; 的含义。
  • 你能指出你得到的错误是什么/什么部分不工作

标签: c arrays pointers


【解决方案1】:

我创建了一个新数组,我将在其中保存数字,以便检查数组中是否有重复数字。我在函数中还有一个参数可以知道数组的大小。

#include <stdio.h>
#include <stdlib.h>

int checkArray(int *arr, int size, int number){
    int i,j;
    int *countArray = calloc(size,sizeof(int));
    for(i=0;i<size;i++){
        if(arr[i]>=number){  //Check >= number
            free(countArray);
            return 0;
        }
        for(j=0;j<i;j++){ //Check repeat number
            if(countArray[j]==arr[i]){
                free(countArray);
                return 0;
            }
        }
        countArray[j]=arr[i]; //no repeat number so we save it.
    }

    free(countArray);
    return -1; //Error

}

int main(){
  int arr[6] = {0,8,2,3,4,1};
  printf("Result %d",checkArray(arr,6,5));

}

希望对你有帮助。

没有新数组的更新

int checkArray(int *arr, int size, int number){
    int i,j;
    for(i=0;i<size;i++){
        if(arr[i]>=number){
            return 0;
        }
        for(j=0;j<i;j++){
            if(arr[i]==arr[j]){
                return 0;
            }
        }
    }    
    return -1; //Error    
}

【讨论】:

  • 感谢您花时间制作它,我没想过复制原件并进行比较……现在看起来容易多了。
  • 我认为可能使用额外的空间不是一种选择,因为它没有带来任何时间复杂度的好处。 :D
  • @Anshul 我改进了我的解决方案。感谢您的评论。
【解决方案2】:

将上面的 for 循环更改为:

  for ( ; num > 0; num--) {
     if(arr[i]>=number){
         return 0;
      }
        int check3 = num;
        poi=arr+1;
        for ( ; check3 > 0; check3--) {
            if (*arr == *poi)
                return 0;
            poi++;
        }
        arr++;
    }

并删除底部的。

【讨论】:

  • 是的,我更改了太多次代码,在原来的代码中我从 arr+1 开始,不记得为什么要改回来.. 不过谢谢!
  • 还有很多其他方法可以处理这个问题。我试图在你的代码中找到问题。因为不知道限制,可能是你不被允许使用额外的空间。 :)
【解决方案3】:

这里的错误如下:

1- 你需要换行:

int check3 = num;
for ( ; num > 1; num--) {

成为:

for ( ; num > 1; num --) { 
    int check3 = check; // Move to inside loop to reset each time for a fresh inner loop and use check instead of num to reset the value

2- 你需要换行:

for ( ; check3 >= 0; check3--) {

成为

for ( ; check3 > 0; check3--) { // Because `>=0` means attempting to read past the array

3- poi 应在循环中每次初始化为 arr+1 以跳过将数组的同一成员与其自身进行比较,并跳过多次重新比较成员。

我建议用更好的代码风格重写方法,以便更容易检测到此类错误和拼写错误

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 2014-05-15
    • 2012-05-20
    • 1970-01-01
    • 2014-02-03
    • 2018-03-31
    • 2018-01-15
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多