【问题标题】:FInd index of an element in sorted array, if not found, print index where it should be inserted查找排序数组中元素的索引,如果没有找到,打印应该插入的索引
【发布时间】:2017-12-14 23:12:02
【问题描述】:

打印排序数组中正在搜索的目标元素的索引。如果未找到该元素,则打印应插入的索引,保持数组排序。

我用 C 编写了这个程序,但不明白我哪里出错了,它没有按预期工作。

    #include<stdio.h>
    int main(){
        int n,t,i,k=0,l=0;
        int arr[50];
        scanf("%d",&n);
        for(i=0;i<n;i++){
                scanf("%d",&arr[i]);
        }
        scanf("%d",&t);
        // Array size should be less than 50
        if(n>50){
                printf("Array size exceeded");
                return 0;
        }
        //Check array is sorted and has no duplicates
        for(i=0;i<n-1;i++){
                if(arr[i] == arr[i+1])
                        k++;
                if(arr[i] > arr[i+1])
                        l++;
        }
        if(k!=0){
                printf("No duplicates allowed");
                return 0;
        }
        if(l!=0){
                printf("Array must be sorted");
                return 0;
        }
        //Find element index or print where it should be inserted
        for(i=0;i<n;i++){
                if(arr[i] == t){
                        printf("%d",i);
                        return 0;
                }
                if(arr[i] > t){
                        printf("%d",i);
                        return 0;
                }
                else{
                        printf("%d",n+1);
                        return 0;
                }
        }
}

【问题讨论】:

  • 既然你的数组是排序好的,为什么不用二分查找算法呢?
  • 检查n的值你开始读入你的数组的值。
  • 最后的 for 循环没有做你想做的事
  • 二分搜索是一个非常好的意见。感谢那。好的,我会尽力让你知道。

标签: c arrays loops sorting search


【解决方案1】:

我认为您的问题是您总是在最终循环的第一次迭代后打印并返回。我不能确定,因为我不知道你给出的输入、你得到的输出和预期的输出

尝试改变

    //Find element index or print where it should be inserted
    for(i=0;i<n;i++){
            if(arr[i] == t){
                    printf("%d",i);
                    return 0;
            }
            if(arr[i] > t){
                    printf("%d",i);
                    return 0;
            }
            else{
                    printf("%d",n+1);
                    return 0;
            }
    }

    //Find element index or print where it should be inserted
    for(i=0;i<n;i++){
            if(arr[i] == t){
                    printf("%d",i);
                    return 0;
            }
            if(arr[i] > t){
                    printf("%d",i);
                    return 0;
            }
    }
    printf("%d",n+1);
    return 0;

这样做的原因是,如果数组中的第一个元素小于 t,则无论其他元素如何,都将打印 n+1。 此外,您可能希望在其他所有内容之后打印一个换行符,因此请将\n 添加到您的第一个参数的末尾。

【讨论】:

    【解决方案2】:

    最后一个循环的 else 语句中的逻辑有问题。

    正确的代码-

    #include<stdio.h>
    int main(){
        int n,t,i,k=0,l=0;
        int arr[50];
        scanf("%d",&n);
        for(i=0;i<n;i++){
                scanf("%d",&arr[i]);
        }
        scanf("%d",&t);
        // Array size should be less than 50
        if(n>50||n<=0){
                printf("Array size exceeded");
                return 0;
        }
        //Check array is sorted and has no duplicates
        for(i=0;i<n-1;i++){
                if(arr[i] == arr[i+1])
                        k++;
                if(arr[i] > arr[i+1])
                        l++;
        }
        if(k!=0){
                printf("No duplicates allowed");
                return 0;
        }
        if(l!=0){
                printf("Array must be sorted");
                return 0;
        }
        //Find element index or print where it should be inserted
        for(i=0;i<n;i++){
                if(arr[i] == t){
                        printf("%d",i);
                        return 0;
                }
                if(arr[i] > t){
                        printf("%d",i);
                        return 0;
                }
                else{
                        printf("%d",i+1);
                        return 0;
                }
        }
    }
    

    建议 - 对已排序的数组使用二分搜索。

    【讨论】:

    • 你把对数组大小的检查留到为时已晚;在开始将值读取到其中之前,您应该检查它是否在范围内。可以说,您也应该检查大小既不是负数也不是零。您的最终循环仍然不稳定。它只在终止前检查arr[0]
    猜你喜欢
    • 2014-06-22
    • 2014-01-07
    • 2016-06-08
    • 2016-06-09
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多