一道简单的面试题(数组)

题目:

#面试编程题#给定一个长度为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");	
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值