提问人:appy 提问时间:7/30/2015 最后编辑:Tim Biegeleisenappy 更新时间:2/18/2021 访问量:147
查找任意范围的序列
Find Sequences of any range
问:
给定一个数字数组,打印每个可用的范围。 例如 阵列 : 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 语言编写代码。
答:
下一步是识别序列。请尝试以下循环(未完全调试):
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++;
}
评论
我给你写了一个简单易读的函数,一起来看看:
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 和 是相同的。您可以替换为 。current
current
printEnd
current
printEnd
评论
如果你可以改变原来的数组,也就是说,如果你可以对它进行排序,那么程序可以看起来像
#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 }
评论
这里已经有一些关于这个任务的很好的答案,但也许一开始的排序部分值得多谈一点。特别是如果你在学校、大学或工作面试中需要这样的东西。
最简单的排序技术/算法是类似 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 使用一种称为递归的技术。如果您不熟悉,可以查看此处:
在计算机科学中,递归是一种解决问题的方法,其中解决方案取决于同一问题的较小实例的解。此类问题通常可以通过迭代来解决,但这需要在编程时识别和索引较小的实例。递归通过使用从自己的代码中调用自己的函数来解决此类递归问题。这种方法可以应用于许多类型的问题,递归是计算机科学的核心思想之一。
评论