查找任意范围的序列

Find Sequences of any range

提问人:appy 提问时间:7/30/2015 最后编辑:Tim Biegeleisenappy 更新时间:2/18/2021 访问量:147

问:

给定一个数字数组,打印每个可用的范围。 例如 阵列 : 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 我将按升序排序,我不知道下一步该怎么做? PS :我正在用 C 语言编写代码。

C 数组排序 范围 序列

评论


答:

0赞 Paul Ogilvie 7/30/2015 #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++;
}

评论

0赞 Tim Biegeleisen 7/30/2015
他的排序代码也可能有问题。看起来他正试图做一个泡沫分类。
0赞 Paul Ogilvie 7/30/2015
你可以问,并展示你尝试过的代码。我们应该只帮助你修复[思想]错误,而不是做你的功课。
0赞 mazhar islam 7/30/2015 #2

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

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;
        }
    }
}

实时运行。

请注意,为了便于理解,变量被声明为 while 和 是相同的。您可以替换为 。currentcurrentprintEndcurrentprintEnd

评论

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

如果你可以改变原来的数组,也就是说,如果你可以对它进行排序,那么程序可以看起来像

#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 }

评论

0赞 Martijn Pieters 7/30/2015
评论不用于扩展讨论;此对话已移至 Chat
0赞 Tristan B 2/12/2021 #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;
           }
       }
   }
}

来源和更多信息

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

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);
   }
}

来源和更多信息

注意:QuickSort 使用一种称为递归的技术。如果您不熟悉,可以查看此处:

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

来源和更多信息

评论

0赞 sɐunıɔןɐqɐp 2/12/2021
来自评论:嗨,虽然链接是分享知识的好方法,但如果将来它们被破坏,它们将无法真正回答这个问题。在您的答案中添加回答问题的链接的基本内容。如果内容太复杂或太大而无法容纳在这里,请描述所建议解决方案的总体思路。请记住始终保留对原始解决方案网站的链接引用。请参阅:如何写出好的答案?