【问题标题】:Find Sequences of any range查找任意范围的序列
【发布时间】:2015-10-21 12:12:59
【问题描述】:

给定一个数字数组,打印每个可用的范围。 例如 数组:9、3、5、7、4、8、1 输出:1、3-5、7-9 注意:请在不使用额外数组的情况下执行此问题。

我该如何进行? *

#include<stdio.h>
int main()
{
int a[]={9,8,8,7,6,5,14};
int n= sizeof(a) / sizeof(a[0]);
int i,j;
int temp;
for(i=0;i<n;i++)
         {
               for(j=i+1;j<n;j++)
               {
                     if(a[i]>a[j])
                     {
                           temp=a[i];
                           a[i]=a[j];
                           a[j]=temp;
                     }
               }
        }
}

* 1st我将按升序排序,我不知道下一步该怎么做? P.S:我正在用 C 编写代码。

【问题讨论】:

    标签: c arrays sorting range sequence


    【解决方案1】:

    下一步是识别序列。尝试以下循环(未完全调试):

    first= next= a[0];
    for (i=1; i<n; i++) {
        if (a[i] > next+1) {
            if (next>first)
                 printf("%d-%d,", first, next);
            else printf("%d,", first);
            first= next= a[i];
        }
        else next++;
    }
    

    【讨论】:

    • 他的排序代码也可能有问题。看起来他正在尝试进行冒泡排序。
    • 您可以询问,并显示您尝试过的代码。我们应该只帮助你修复 [思想] 错误,而不是做你的功课。
    【解决方案2】:

    如果您可以更改原始数组,如果您可以对其进行排序,那么程序可能看起来像

    #include <stdlib.h>
    #include <stdio.h>
    
    int cmp( const void *lhs, const void *rhs )
    {
        int a = *( const int * )lhs;
        int b = *( const int * )rhs;
    
        return ( b < a ) - ( a < b );
    }
    
    int main()
    {
        int a[] = { 9, 8, 8, 7, 6, 5, 14 };
        const size_t N = sizeof( a ) / sizeof( *a );
    
        qsort( a, N, sizeof( int ), cmp );
    /*    
        for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
        printf( "\n" );
    */    
        int *p = a;
        int *start = a, *end = a;
        do
        {
            if ( ++p == a + N || *p  != *end + 1 )
            {
                printf( "{ %d", *start );
                start == end ? printf( " }\n" ) : printf( ", %d }\n", *end );
                start = end = p;
            }
            else
            {
                end = p;
            }
        } while ( p != a + N );            
    }    
    

    程序输出是

    { 5, 8 }
    { 8, 9 }
    { 14 }
    

    【讨论】:

    【解决方案3】:

    我写了一个简单易读的函数给你看:

    void printRange(int sortedArray[], int len) {
        int i, current, next, printStart, printEnd, startIndex = 0;
        bool print = false;
    
        for (i = 0; i < len; i++) {
            printStart = sortedArray[startIndex];
            printEnd = sortedArray[i];
    
            current = sortedArray[i];
            if(i < len -1) {
                 next = sortedArray[i + 1];
            } else
                  next = current;
    
            if (next - current != 1) {
                startIndex = i + 1;
                print = true;
            }
    
            if (print) {
                if (printStart - printEnd == 0) {
                    printf("%d,", printStart);
                } else {
                    printf("%d-%d,", printStart, printEnd);
                }
                print = false;
            }
        }
    }
    

    Run live.

    注意,为了更好地理解变量current 被声明而currentprintEnd 是相同的。您可以将current 替换为printEnd

    【讨论】:

    • @Akash,这是一个完全不同的问题。打开另一个线程并提出该问题。因为不方便在评论中给出答案。
    • @VladfromMoscow,可以,因为我没有从所有可能的情况下测试它,请告诉我在哪种情况下它会给出错误的答案?
    • @Akash,我喜欢在 stackoverflow 中给出答案,因为社区帮助了我很多,所以如果你想得到答案,你只能通过 stackoverflow 与我交流。
    • @rakeb.void 例如在这个语句中 next = sortedArray[i + 1];当 i 等于 len - 1 时,您正试图访问数组之外​​的内存,不是吗?
    • @Akash 有时在某些特定情况下错误的代码可能会起作用。:) 然而,此函数具有未定义的行为并可能产生错误的结果。
    【解决方案4】:

    这里已经有一些关于这个任务的很好的答案,但也许一开始的排序部分值得多谈一点。特别是如果您在学校、大学或工作面试中需要类似的东西。

    最简单的排序技术/算法类似于 BubbleSort,可以通过 2 个 for 循环轻松实现。

    void BubbleSort (int a[], int length)
    {
      int i, j, temp;
      
       for (i = 0; i < length; i++)
       {
           for (j = 0; j < length - i - 1; j++)
           {
               if (a[j + 1] < a[j])
               {
                   temp = a[j];
                   a[j] = a[j + 1];
                   a[j + 1] = temp;
               }
           }
       }
    }
    

    Source and more information

    用整数(或任何类型的数字)对此类数组进行排序的最佳方法是QuickSort。该算法非常先进,但如果您在 Youtube 上观看了精彩视频或阅读此article,您肯定知道它是如何工作的。

    void quick(int array[], int start, int end){
       if(start < end){
           int l=start+1, r=end, p = array[start];
           while(l<r){
               if(array[l] <= p)
                   l++;
               else if(array[r] >= p)
                   r--;
               else
                   swap(array[l],array[r]);
           }
           if(array[l] < p){
               swap(array[l],array[start]);
               l--;
           }
           else{
               l--;
               swap(array[l],array[start]);
           }
           quick(array, start, l);
           quick(array, r, end);
       }
    }
    

    Source and more information

    注意: QuickSort 使用一种称为递归 的技术。不熟悉的可以看这里:

    在计算机科学中,递归是一种解决问题的方法,其解决方案取决于同一问题的较小实例的解决方案。此类问题一般可以通过迭代来解决,但这需要在编程时识别和索引较小的实例。 递归通过在自己的代码中使用调用自身的函数来解决此类递归问题。该方法可以应用于多种类型的问题,递归是计算机科学的核心思想之一。

    Source and more information

    【讨论】:

    • 点评来源: 嗨,虽然链接是分享知识的好方法,但如果它们在未来被破坏,它们将不会真正回答问题。将回答问题的链接的基本内容添加到您的答案中。如果内容太复杂或太大而无法在此处放置,请描述所提出解决方案的总体思路。请记住始终保留对原始解决方案网站的链接引用。见:How do I write a good answer?
    猜你喜欢
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多