一道简单的面试题(数组)
来源:互联网 发布:游开服表数据 编辑:程序博客网 时间:2024/04/30 05:27
题目:
#面试编程题#给定一个长度为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");}}
- 一道简单的面试题(数组)
- 一道简单PHP数组的面试题
- 一道简单的面试题
- 一道简单的面试题
- 一道简单的面试题
- 关于数组指针的一道面试题
- 一道二维数组的面试题
- 一道比较简单的Google面试题
- 一道简单的支付宝面试题
- 一道简单的阶层面试题
- 一道简单的java面试题
- 一道有趣的面试题 简单DP?
- 一道看似简单的面试题
- 一道简单而又不简单的面试题
- oracle一道简单面试题和一道深入面试题
- 一道面试题的分析(续)
- 一道关于fork()的面试题
- 从一道面试题看指针与数组的区别
- 初学 spring mvc 2(注解+get,post请求+重定向)
- 如何禁止上传目录运行php程序
- 网站权重如何得来
- WebLogic如何更换64位JDK
- ie6图片透明
- 一道简单的面试题(数组)
- Windows7中安装FreeBSD方法
- UVa 1108 最小公倍数
- TOMCAT虚拟主机配置
- java数组与内存分析
- arm 编程常用指令--包含部分宏定义。段定义解释
- java去除非法字符
- 无锁编程之免锁
- 程序