华为的一个笔试题,大大多给点意见,看怎么做

老衲不出家 2012-06-11 05:52:42
加精
#define TIME_TAB_MAX 245
char g_time_tab[TIME_TAB_MAX ][6] = {
"13:46",
"08:23",
"23:12",
"05:59",
...
"09:13",
"12:00",
"02:42",
"22:29",
...
...
};

char g_sleep_time[6] = {
"21:30"
};

用C语言编写函数,从g_time_tab 中找出最接近g_sleep_time的时间,并且printf 出结果。
...全文
20854 216 打赏 收藏 转发到动态 举报
写回复
用AI写文章
216 条回复
切换为时间正序
请发表友善的回复…
发表回复
小小的CODER 2015-02-06
  • 打赏
  • 举报
回复
不是有个strtok吗?
猿人123 2014-10-31
  • 打赏
  • 举报
回复
就一个个字符的比较不错呢
qq_17543901 2014-10-27
  • 打赏
  • 举报
回复
新手我看不懂
ydZH 2014-10-18
  • 打赏
  • 举报
回复
排序有必要吗?遍历一遍时间复杂度不过O(n),而排序哪个算法时间复杂度不必它大。
yyzx17445408 2014-09-25
  • 打赏
  • 举报
回复
排序 循环链表
AlexWakefield 2014-09-24
  • 打赏
  • 举报
回复
其实只需要加后文那个是否大于720分钟的判断就够了,前文加24小时没有什么意义。。。不过我也是在你的基础上考虑到这一点。 //
引用 20 楼 demonleer 的回复:

#include <stdio.h>

#define MAX_TAB_TIME 10
#define ABS_VALUE(x) ((x)<0?(-(x)):(x))

int distance = 0;
char g_tab_time[MAX_TAB_TIME][6] = 
{
	"22:08",
	"08:31",
	"18:25",
	"21:35",
	"01:35",
	"23:45",
	"00:03",
	"09:34",
	"07:23",
	"09:59"
};

int str_to_time(char *p)
{
	int hour = 0, minute = 0;
	char *tmp = p;
	int flag = 0;
	if (*tmp=='0')
	{
		flag = 1;
		tmp++;
	}
	while (*tmp!=':')
	{
		hour = hour*10 + *tmp++ - '0';
	}
	tmp++;
	while (*tmp!='\0')
	{
		minute = minute*10 + *tmp++ - '0';
	}
	return hour*60+minute+flag*24*60;
}

void main()
{
	char g_sleep_time[6] = {"12:30"};
	int i = 0;
	int result;
	int target = 0;
	char *p;
	for (; i<MAX_TAB_TIME; i++)
	{
		result = str_to_time(g_sleep_time) - str_to_time(g_tab_time[i]);
		result = ABS_VALUE(result);
		if (result>720) //在代码里加上这个条件,刚刚的代码有个重大的BUG,不好意思
		{
			result = 1440 - result;
		}
		if (i==0)
		{
			distance = result;
		}
		else
		{
			if (result<distance)
			{
				distance = result;
				target = i;
			}
		}
	}
	p = g_tab_time[target];
	printf("the most closest time is: \n");
	printf("%s\n",p);
}
shenggu2020 2014-09-10
  • 打赏
  • 举报
回复
好难啊啊 啊啊啊啊
nextseconds 2014-08-27
  • 打赏
  • 举报
回复
#define TIME_TAB_MAX 8 char g_time_tab[TIME_TAB_MAX ][6] = {"13:46","08:23","23:12","05:59","09:13","12:00","02:42","22:29"}; char g_sleep_time[6] = {"00:30"}; int str_int(char ch[]) { return ((ch[0]-'0')*1000 +(ch[1]-'0')*100 +(ch[3]-'0')*10 +(ch[4]-'0')); } int SubValue(int a,int b) { int nValue = 0; if(a>b) { nValue = a-b; } else { nValue = b-a; } if(nValue >(2400/2)) { return 2400-nValue; } return nValue; } void PrintValue() { int nMin = 0; int nIndex = 0; int nValueInit = str_int(g_sleep_time); for(int i=0;i<TIME_TAB_MAX;i++) { if(i==0) { nMin =SubValue(str_int(g_time_tab[i]),nValueInit); nIndex = i; } else { int nCheck = SubValue(str_int(g_time_tab[i]),nValueInit); if(nMin >nCheck) { nMin = nCheck; nIndex = i; } } } cout<<g_time_tab[nIndex]<<endl; } void main() { PrintValue(); }
sdfDww1 2014-08-01
  • 打赏
  • 举报
回复
先排序再用二分法查找,使用strcmp直接比较。这样应该可行吧。
ymh1520 2014-07-19
  • 打赏
  • 举报
回复
我也是醉了 不用回复我了 lz
ymh1520 2014-07-19
  • 打赏
  • 举报
回复
[quote=引用 7 楼 demonleer 的回复:] [code=C/C++] #include <stdio.h> #define MAX_TAB_TIME 10 #define ABS_VALUE(x) ((x)<0?(-(x)):(x)) int distance = 0; char g_tab_time[MAX_TAB_TIME][6] = { "22:08", "08:31", "18:25", "21:35", "01:35", "23:45", "00:03", "09:34", "07:23", "14:31" }; int str_to_time(char *p) { int hour = 0, minute = 0; char *tmp = p; int flag = 0; if (*tmp=='0') { flag = 1; tmp++; } while (*tmp!=':') { hour = hour*10 + *tmp++ - '0'; } tmp++; while (*tmp!='\0') { minute = minute*10 + *tmp++ - '0'; } return hour*60+minute+flag*24*60; } void main() { char g_sleep_time[6] = {"21:30"}; int i = 0; int result; int target = 0; char *p; for (; i<MAX_TAB_TIME; i++) { result = str_to_time(g_sleep_time) - str_to_time(g_tab_time[i]); result = ABS_VALUE(result); if (i==0) { distance = result; } else { if (result<distance) { distance = result; target = i; } } } p = g_tab_time[target]; printf("the most closest time is: \n"); printf("%s\n",p); } 最后的p = g_tab_time[target];是什么意思 p是个指针 g_tab_time[target]是个数组元素 怎么能直接赋值呢
北刘宽 2014-05-12
  • 打赏
  • 举报
回复
引用 7 楼 demonleer 的回复:

#include <stdio.h>

#define MAX_TAB_TIME 10
#define ABS_VALUE(x) ((x)<0?(-(x)):(x))

int distance = 0;
char g_tab_time[MAX_TAB_TIME][6] = 
{
	"22:08",
	"08:31",
	"18:25",
	"21:35",
	"01:35",
	"23:45",
	"00:03",
	"09:34",
	"07:23",
	"14:31"
};

int str_to_time(char *p)
{
	int hour = 0, minute = 0;
	char *tmp = p;
	int flag = 0;
	if (*tmp=='0')
	{
		flag = 1;
		tmp++;
	}
	while (*tmp!=':')
	{
		hour = hour*10 + *tmp++ - '0';
	}
	tmp++;
	while (*tmp!='\0')
	{
		minute = minute*10 + *tmp++ - '0';
	}
	return hour*60+minute+flag*24*60;
}

void main()
{
	char g_sleep_time[6] = {"21:30"};
	int i = 0;
	int result;
	int target = 0;
	char *p;
	for (; i<MAX_TAB_TIME; i++)
	{
		result = str_to_time(g_sleep_time) - str_to_time(g_tab_time[i]);
		result = ABS_VALUE(result);
		if (i==0)
		{
			distance = result;
		}
		else
		{
			if (result<distance)
			{
				distance = result;
				target = i;
			}
		}
	}
	p = g_tab_time[target];
	printf("the most closest time is: \n");
	printf("%s\n",p);
}
结果会是21:30。当你把g_sleep_time改成23:59时,输出00:03.
如果把查找数组中添加一个10:00, g_sleep_time改成09:59,输出结果错误
lihuaxiong 2014-05-12
  • 打赏
  • 举报
回复
一个循环把时间分成两组,一个比21:30大(再在其中找最小值A),一个比21:30小(在其中找最大值B)。然后比对两个字符的中间值,比21:30大,就是A接近,否则是B接近
#include <stdio.h>
#include <time.h>
#define TIME_TAB_MAX 245
 char g_time_tab[TIME_TAB_MAX ][6] = {
         "13:46",
         "08:23",
         "23:12",
         "05:59",
         "09:13",
         "12:00",
         "02:42",
         "22:29",
		 "21:29"
 };
 
char g_sleep_time[6] = {
        "21:30"
 };

char g_temp_smallone[6]={"24:00"};
char g_temp_bigone[6]={"00:00"};
void GetSmallestAtMax(int);
void GetBigestAtMin(int);
int ChangeTime(char*);
void main()
{
	int i,j;
/*	clock_t start, finish; 
	double  duration; 
	start = clock();*/
	for (i=0;i<TIME_TAB_MAX;i++)
	{
		for(j=0;(j<6)&&( g_time_tab[i][j]==g_sleep_time[j] );j++);
		if(g_time_tab[i][j]>g_sleep_time[j])
			GetSmallestAtMax(i);
		else GetBigestAtMin(i);
		
	}
	if ( (ChangeTime(g_temp_smallone)+ChangeTime(g_temp_bigone))/2>=ChangeTime(g_sleep_time) )
			printf("%s\n",g_temp_bigone);
	if ( (ChangeTime(g_temp_smallone)+ChangeTime(g_temp_bigone))/2<=ChangeTime(g_sleep_time) )
			printf("%s\n",g_temp_smallone);

/*	finish = clock();  
	duration = (double)(finish - start) / CLOCKS_PER_SEC;  
	printf( "%3.3ld seconds\n", finish ); 
	system("pause");*/
}

int ChangeTime(char*a)
{
	return (a[0]*10+a[1])*60+(a[3]*10+a[4]);
}

void GetSmallestAtMax(int i)
{
	int j;
	for (j=0;j<6;j++)
	{
		if (g_time_tab[i][j]<g_temp_smallone[j])
		{
			strcpy(g_temp_smallone,g_time_tab[i]);
			break;
		}
		else if (g_time_tab[i][j]>g_temp_smallone[j])
			break;
	}
}
void GetBigestAtMin(int i)
{
	int j;
	for (j=0;j<6;j++)
	{
		if (g_time_tab[i][j]>g_temp_bigone[j])
		{
			strcpy(g_temp_bigone,g_time_tab[i]);
			break;
		}
		else if (g_time_tab[i][j]<g_temp_bigone[j])
			break;
	}
}
xuzhouweihao 2014-05-09
  • 打赏
  • 举报
回复
笨方法,先转化为min单位的int型,然后和check值求差的绝对值(如果绝对值大于720,然后和1440求绝对值),找出最小的绝对值,然后和该绝对值对应的时间就是相差最短时间的值。 (排序的话比较复杂,排序后然后二分插入,最后还要恢复为xx:xx格式) 求经典方法…………………… 以上代码如下所示:
#include <stdio.h>
#include <math.h>
#include <string.h>

#define MAX_TAB_TIME 255
#define MAX_TIME 1440

char g_tab_time[MAX_TAB_TIME][6] ={
     "12:28",
     "18:21",
     "08:45",
     "21:24",
     "01:36",
     "13:18",
     "00:02",
     "10:34",
     "17:32",
     "04:13",
     "23:53"
};

int time_atoi(char *time_a)
{
	int time_i;
	int tmp_h;
	int tmp_m;

	tmp_h  = atoi(time_a);
	time_a = time_a+3;
	tmp_m  = atoi(time_a);

	time_i = tmp_h*60 + tmp_m;

	printf("%s = %d    \n", time_a-3, time_i);

	return time_i;
}

int time_diff_get(int a, int b)
{
	int diff;

	diff = abs(a-b);
	if(diff > 720){
		diff = 1440 - diff;
	}

	return diff;
}

int main()
{
	int i, tmp, tab_time;
	int diff_time, diff_time_tmp;
	int g_tab_time_int[MAX_TAB_TIME] = {0};
	int tmp_time;
	char g_check_time[6] = {"23:55"};

	for(i=0; i<MAX_TAB_TIME; i++)
	{
		if(strlen(g_tab_time[i]) == 0){
			tab_time = i;
			break;
		}

		g_tab_time_int[i] = time_atoi(g_tab_time[i]);
	}
	printf("\n");

	tmp_time = time_atoi(g_check_time);
	printf("\n");

	diff_time_tmp = time_diff_get(g_tab_time_int[0], tmp_time);
	tmp = 0;

	for(i=1; i<tab_time; i++){
		diff_time = time_diff_get(g_tab_time_int[i], tmp_time);
		if( diff_time < diff_time_tmp){
			tmp=i;
			diff_time_tmp = diff_time;
		}
	}

	printf("From the time %s is %s.\n", g_check_time, g_tab_time[tmp]);

	return 0;
}
waizheb 2014-03-18
  • 打赏
  • 举报
回复
看不明白呢^^^
lanxuejun 2014-03-15
  • 打赏
  • 举报
回复
学习中,牛人好多呀!!
  • 打赏
  • 举报
回复
能不能调用api啊????
cquptzzq 2014-01-25
  • 打赏
  • 举报
回复
引用 182 楼 ananluowei 的回复:
#102的思路是正确的。把字符串转换成整数表示分钟,遍历一次,逐个比较差值,保存最小的差值和相应的数组索引。 计算差值取绝对值,再判断是否大于半天,大于的话用一天的分钟数减去差值。时间复杂度O(n) 排序完再查找多此一举。复杂度是O(nlogn)。而且算法也复杂,要处理比如11:59和0:00到底怎么排?
最耗时的是21:30-12:00=9:30,不是0:00
cquptzzq 2014-01-25
  • 打赏
  • 举报
回复
引用 188 楼 rong142857 的回复:
鉴于 1)题目意思不用排序 2)转化为数值依然要考虑特殊情况 提出 写个小函数计算两个时间字符串的夹角(不大于180度),然后遍历取小就ok了
这个有意思,取时间夹角
cquptzzq 2014-01-25
  • 打赏
  • 举报
回复
写了才知道,这题真的很有内涵,我想华为最不想看到的就是把字符串一个一个转换成秒,求差值了吧。 1、我本来想按照优先级从小时开始判断,不用多写循环,但是要多用if判定,结果发现判断有点多。比如21:45,21:28,22:10,20:58就是几个典型时间,判断起来要增加数组存储,有点麻烦,但是程序容易读懂。 2、如果是转化成秒来计算差值,注意的可就多了,先是计算二维数组每一项的秒数,再求差值的绝对值,然后找个容器存储,再去找差值最小的(可能存在21:30,21:29,21:31即k=0或者2个k=1的情况),保留下标之后,将原二维数组的数据输出。结果发现,判定也不少,空间利用也不好(虽然只是存储个下标) 极端情况,全是256个数组全是04:30,要全部输出,空间要求最高 3、最开始想的是atoi,但是发现中间有个:以后果断想不出分针该怎么解决了。不知还有没有更好的方法。
加载更多回复(174)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧