华为的一道笔试题

#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 出结果。
在编码之前,首先需要明确的是:如果有多个最近的时间,也必须打印出。我是这样解决的:
1、将所有的时间转换为“秒”。
2、将需要查找的时间和表中的时间进行对比,对比的时候注意是绝对值的对比。
3、如果有相同的最近时间,则将索引全部存储于一个数组中,保存个数。

当然,我这个可能不是最优的做法,源码如下:

#include <stdio.h>
#define TIME_TAB_MAX 10
int count = 0;
char g_time_tab[TIME_TAB_MAX][6] = 
{
	"05:08",
	"17:54",
	"21:32",
	"07:08",
	"07:00",
	"22:22",
	"15:43",
	"23:56",
	"02:01",
	"04:12",
};
int SearchTimeFormTab(int srcTime,int* srcTimeTab,int *retTime)
{
	int iTemp = 0;
	int min = 0;
	int jTemp = 0;
	min = *(srcTimeTab + 0) - srcTime;
	retTime[jTemp ++] = 0;
	for (iTemp = 1;iTemp < TIME_TAB_MAX;iTemp ++)
	{
		if(abs(min) == abs(*(srcTimeTab + iTemp) - srcTime))
		{
			retTime[jTemp ++] = iTemp;
			continue;
		}
		if(abs(min) > abs(*(srcTimeTab + iTemp) - srcTime))
		{
			min = *(srcTimeTab + iTemp) - srcTime;
			memset(retTime,0,sizeof(retTime));
			jTemp = 0;
			retTime[jTemp ++] = iTemp;
		}
	}
	return jTemp;
}
int Time2Sec(char* time)
{
    short iTemp = 0;
    short jTemp = 0;
    char timestr[3][3] = {0};
    while(*(time + iTemp))
    {
        if ((*(time + iTemp) < '0') || (*(time + iTemp) > '9'))
        {
            strncpy(timestr[jTemp ++],time + iTemp - 2,2);
        }
        iTemp ++;
    }
    strncpy(timestr[jTemp],time + strlen(time) - 2,2);
    return atoi(timestr[0]) * 3600 + atoi(timestr[1]) * 60 + atoi(timestr[2]);  
}
void SearchTimeInfo(const char* srcTime,int *retTime)
{
	int sec_Time_Tab[TIME_TAB_MAX] = {0};
	int src_Time_Temp = 0;
	int iTemp = 0;
	src_Time_Temp = Time2Sec(srcTime);//转化为秒
	for (iTemp = 0;iTemp < TIME_TAB_MAX;iTemp ++)
	{
		sec_Time_Tab[iTemp] = Time2Sec(g_time_tab[iTemp]);
	}
	count = SearchTimeFormTab(src_Time_Temp,sec_Time_Tab,retTime);//在表中查找
}
int main(void)
{
	char g_sleep_time[6] = {"07:04"};
	int retTime[TIME_TAB_MAX] = {0};
	int iTemp = 0;
	SearchTimeInfo(g_sleep_time,retTime);//查询
	for (iTemp = 0;iTemp < count;iTemp ++)
	{
		printf("%s\n",g_time_tab[retTime[iTemp]]);
	}
	getch();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值