滴水逆向联盟

标题: 华为的一个笔试题,大大多给点意见,看怎么做 [打印本页]

作者: 大灰狼    时间: 2014-5-20 09:48
标题: 华为的一个笔试题,大大多给点意见,看怎么做
#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 出结果。

作者: 牛郎    时间: 2014-5-21 03:24
本帖最后由 牛郎 于 2014-5-22 03:53 编辑

实现了 楼主的要求 :D:D  可能不是最简化 但是可以作为参考
#include "stdafx.h"
#include "stdio.h"
//题目: 用C语言编写函数,从g_time_tab 中找出最接近g_sleep_time的时间,并且printf 出结果。

#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","00:01","00:15","17:20","05:09","08:59","13:20","09:45","20:17","23:23","14:08","01:59","16:40","23:00","21:31"};//二维数组"13:46"

char g_sleep_time[6] = {"21:30"};//依据数据




//解题思路
//首先知道了需要寻找的值 既然是靠近 那么就采取用这个数减去需要寻找的值 取差值最小的 负数需要变正
//这就需要处理时间变化为我们所认识的阿拉伯数
//首先把需要找的数据转换

int fun_time(char time[])//时间转换整数
{
        int Num3;
        int Num2;
        int Num1;
        int Num;

        Num = 0;
        Num1 = 0;
        Num2 = 0;
        Num3 = 0;

        if (time[0]!=0)
        {
                Num3 = (time[0]-48)*1000;
                Num2 = (time[1]-48)*100;
                Num1 = (time[3]-48)*10;
                Num = Num3 + Num2 + Num1 + (time[4]-48);
        }
        return Num;
}

int main(int argc, char* argv[])
{

        int time;
        int Findtime;
        int i;
        int j;
        int k = 0;
        int m = 0;
        int Num[245];
        int Num1[245];
        int tmp0;
        time = fun_time(g_sleep_time);//依据值
        
        for (i = 0;i < 245;i++)//一维245时间个数  //二维6 是成员
        {
                Findtime =         fun_time(g_time_tab);
                if (Findtime == 0)
                {
                        // 时间是00:00
                        Findtime = 2400;
                        Num【i】 = time -Findtime;//保存所有时间
                }
                else
                {        
                        Num
【i】 = time -Findtime;//保存所有时间
                }
        }

        //求出了差值 那么其中的差值肯定有正数负数
//那么就分成两部来比较 负数与负数比较,正数与整数比较
        for(i = 0;i < 245;i++)
        {
                if (Num
【i】 > 0)
                {
                        Num1[k] = Num
【i】;
                        k++;
                }
                else
                {
                        Num1[244-m] = Num
【i】;
                        m++;
                }
        }

//比较正数        整数求出最小
        for (i = 0;i < k;i++)
        {
                for (j = i + 1;j < k;j++)
                {
                        if (Num1【i】 > Num1[j])  //这个地方发帖会被省略 只能这样写 自己改一下
                        {
                                tmp0 = Num1
【i】;
                                Num1
【i】 = Num1[j];
                                Num1[j] = tmp0;
                        }
                }        
        }
//        printf("正数最小 %d\n",Num1[0]);

//比较负数        负数求出最大        
        for (i = k;i < 245;i++)
        {
                for (j = i + 1;j < 245;j++)
                {
                        if (Num1
【i】 < Num1[j])
                        {
                                tmp0 = Num1
【i】;
                                Num1
【i】 = Num1[j];
                                Num1[j] = tmp0;
                        }
                }        
        }
//        printf("负数最大 %d\n",Num1[k]);

//求出最小正数 和最大负数
//最后一步比较这两个数的大小
        if(Num1[0] > -Num1[k])
        {
                //最终时间 最接近
                time = time - Num1[k];
        }
        else
        {
                //最终时间最接近
                time = time - Num1[0];

        }
        printf("最接近的时间:%d\n",time);
        return 0;
}




作者: 遗忘的三伏天    时间: 2014-5-21 18:27





欢迎光临 滴水逆向联盟 (http://www.dtdebug.com/) Powered by Discuz! X3.2