C语言名题精选百则——序曲
?
C语言名题精选百则——序曲
?
尊重他人的劳动,支持原创
从本篇博文开始,D.S.Qiu(以后就这么称呼自己了)将对《C语言名题精选百则》进行整理推出,不光只是书上的名题,还会依据互联网的资源进行不断补充,加强。等全书各个章节都整理完,会做一个总汇。如果你有建议、批评或补充,请你不吝提出(email:gd.s.qiu@gmail.com,或者直接在本文末评论)。你的支持和鼓励,我将渐行渐远!
终于完成《C语言名题精选百则——序曲》这篇博客了,这系列的每个问题都尽量会有【题目说】【解答】【问题实现】【习题】,如果可以的话,还会有【算法改进】这个分块(如问题1.1最长平台的算法改进,个人觉得还是很不错的),《序曲》主要是介绍了关于有序数组的5个问题(点击查看更多数组和字符串问题),相对简单,但是要是尽善进美还有待不断的挖掘。下一篇是《数字问题》(其实就是数论的一些问题),更多关注:http://dsqiu.iteye.com。
?
问题1.1最长平台(PLATEAU.C )
?
已知一个已经从小到大排序的数组,这个数组中的一个平台(Plateau)就是连续的一串 值相同的元素,并且这一串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,6中1,2.2,3.3.3,4,5.5,6 都是平台。试编写一个程序,接收一个数组,把这个数组中最长的平台找出来。在上面的 例子中3.3.3就是该数组中最长的平台。
?
【说明】
这个程序十分简单,但是要编写好却不容易,因此在编写程序时应该考虑下面几点:
(1)使用的变量越少越好。
(2)能否只把数组的元素每一个都只查一次就得到结果?
(3)程序语句也要越少越好。
?
【问题实现】
int longest_plateau(int x[], int n){ int length = 1; /* plateau length >= 1. */ int i; for (i = 1; i < n; i++) if (x[i] == x[i-length]) length++; return length;}?
【算法改进】
如果不考虑题目说明中的条件限制,可以对该算法进行改进。
这里先给出参考②的改进方法,改进这个算法主要是能够减少比较,那就只有可能是依据当前的长度leng进行跳跃。int longest_plateau(int x[],int n){ if(n== 0) return 0; int length = 0; int start = 0; while(start + length< n) { start += length; int elem = array[start]; if(array[start - length] != elem) { for(;array[start - 1] == elem;start --); continue; } for(;start < n && array[start] == elem;length ++,start ++); } return length; }??
问题1.2支配值数目(GT_COUNT.C )
int dominance_count(int f[], int g[], int m, int n){ int index_f, index_g; int count; count = index_f = index_g = 0; while (index_f < m && index_g < n) if (f[index_f] <= g[index_g]) index_f++; else index_g++, count += m - index_f; return count;}int coincidence_count(int f[], int g[], int m, int n){ int index_f, index_g; /* subscripts for f and g */ int count; /* equal pair counter */ count = index_f = index_g = 0; while (index_f < m && index_g < n) if (f[index_f] < g[index_g]) /* if f[] is less */ index_f++; /* then move f */ else if (f[index_f] > g[index_g]) /* if f[] > */ index_g++; /* then move g */ else count++, index_f++, index_g++; /* EQUAL */ return count;}#define min(x, y) ((x) < (y) ? (x) : (y))int min_distance(int x[], int y[], int m, int n){ int minimum = INT_MAX; /* INT_MAX is from limits.h */ int index_x = 0, index_y = 0; while (index_x < m && index_y < n) if (x[index_x] >= y[index_y]) { minimum = min(minimum, x[index_x]-y[index_y]); index_y++; } else { minimum = min(minimum, y[index_y]-x[index_x]); index_x++; } return minimum;}int head_tail(int x[], int n){ int prefix = 0, suffix = 0; int prefix_idx = 0, suffix_idx = n-1; int count = 0; while (suffix_idx >= 0 && prefix_idx <= n-1) if (prefix < suffix) /* prefix too small */ prefix += x[prefix_idx++]; else if (prefix > suffix) /* suffix too small */ suffix += x[suffix_idx--]; else { /* get an equal pair: */ count++; /* increase count and */ prefix += x[prefix_idx++]; /* advance pref.*/ suffix += x[suffix_idx--]; /* and suffix */ } return count;}②zhang_xzhi_xjtu:http://zhang-xzhi-xjtu.iteye.com/blog/506185