一道简单的面试题(数组)
2013-04-16 17:22
267 查看
题目:
#面试编程题#给定一个长度为n整数型数组,看是否满足以下条件,相临数字之差的绝对值,刚好可以组成 1,2,...,n-1。例如:2 5 4 6 --> 1, 2, 3 成立。2 5 4 7 --> 1, 3, 3 不成立。1 2 3 4 --> 1, 1, 1 不成立。
出自陈利人老师的微薄http://weibo.com/1915548291/zrVFUhKsB,里面评论中也说了很多方法。
我第一反映是先求差,再排序比较,这个的时间复杂度是O(nlgn);而后看了评论后用位图的方法做,可以在线性时间内完成,于是就简单的敲了一下代码。
#面试编程题#给定一个长度为n整数型数组,看是否满足以下条件,相临数字之差的绝对值,刚好可以组成 1,2,...,n-1。例如:2 5 4 6 --> 1, 2, 3 成立。2 5 4 7 --> 1, 3, 3 不成立。1 2 3 4 --> 1, 1, 1 不成立。
出自陈利人老师的微薄http://weibo.com/1915548291/zrVFUhKsB,里面评论中也说了很多方法。
我第一反映是先求差,再排序比较,这个的时间复杂度是O(nlgn);而后看了评论后用位图的方法做,可以在线性时间内完成,于是就简单的敲了一下代码。
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> char subAbs(char a,char b) { return (a-b)<0?(b-a):(a-b); } int compare(const void *a,const void *b) { return (*(char *)a - *(char *)b); } int setbitmap(int slope,int offset,int *bitmap) { if( *(bitmap+slope) & (0x1<<offset)){ return 1; }else{ *(bitmap+slope) |= (0x1<<offset) ; } return 0; } int IsOkArray(char data[],int len) { int i; char *sub = NULL; sub = (char *)malloc(len); if(NULL == sub){ return -1; } int bitmap[32]={0}; int max = 0; for(i=0;i<len-1;i++){ sub[i] = subAbs(data[i],data[i+1]); if(sub[i]>max){ max = sub[i]; } if(setbitmap((int)sub[i]/32,(int)sub[i]%32-1,bitmap) != 0){ free(sub); return 1; } } i=0; while(i < (max/32)){ if(bitmap[i++] != ~0){ free(sub); return 1; } } if(bitmap[i] != ((0x1<<(max%32))-1)){ free(sub); return 1; } /* qsort(sub,len-1,sizeof(char),compare); //O(nlgn) for(i=0;i<len-1;i++){ if(sub[i] != i+1){ return 1; } } */ free(sub); return 0; } int main(void) { char data1[4] = {2,5,4,6}; char data2[12] = {1,2,4,7,11,16,22,29,37,46,56,67}; if(IsOkArray(data1,sizeof(data1)) == 0){ printf("data1 is ok!\n"); }else{ printf("data1 is wrong!\n"); } if(IsOkArray(data2,sizeof(data2)) == 0){ printf("data2 is ok!\n"); }else{ printf("data2 is wrong!\n"); } }
相关文章推荐
- 一道简单的面试题
- 一道不简单又简单的Google面试题
- 关于一道简单的Java 基础面试题的剖析: short s1=1;s1 = s1 +1会报错吗?
- 关于一道简单的Java 基础面试题的剖析: short s1=1;s1 = s1 +1会报错吗?
- 每日一道算法题:微软面试题:在排序数组中,找出给定数字出现的次数
- 一道简单的面试题(续)
- 一道关于返回指针和返回数组名的面试题
- 一道看似复杂但是简单的c#面试题
- 一道只能用乘法不能用除法的数组面试题
- 华为一道面试题,不能用系统的字符串函数求对等数,用最简单的方法实现。
- 关于数组指针的一道面试题
- 关于javascript 数组的正态分布排序的一道面试题
- 一道简单的java面试题
- 交换两个数组值使两个数组之差最小----一道面试题
- 一道关于finally的看似非常简单但很多人都做错的Java面试题
- 一道简单有趣的C语言面试题
- 一道简单的面试题
- 一道看似简单的面试题
- 一道简单的python面试题-购物车
- 一道面试题: C能申请的最大全局数组大小?