华为机试——6个数找最大时间

题目描述

* 题目描述:给定一个数组,里面有6个整数,求这个数组能够表示的最大24进制的时间是多少,
*           输出这个时间,无法表示输出invalid
* 输入描述:输入为一个整数数组,数组内有6个整数
*           输入整数数组长度为6,不需要考虑其它长度,元素值为0或者正整数,
*           6个数字每个数字只能使用一次。
* 输出描述:输出为一个24进账格式的时间,或者字符串“invalid”

* 示例输入:[0,2,3,0,5,6]
* 示例输出: 23:56:00

代码实现

/**************************************************************
 * * 题目描述:给定一个数组,里面有6个整数,求这个数组能够表示的最大24进制的时间是多少,
 * *           输出这个时间,无法表示输出invalid
 * * 输入描述:输入为一个整数数组,数组内有6个整数
 * *           输入整数数组长度为6,不需要考虑其它长度,元素值为0或者正整数,
 * *           6个数字每个数字只能使用一次。
 * * 输出描述:输出为一个24进账格式的时间,或者字符串“invalid”
 * * 
 * * 示例输入:[0,2,3,0,5,6]
 * * 示例输出: 23:56:00
 * **************************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define IN_BUF_SIZE             6

/* 在数组中找不大于某数的最大数字 */
int find_max(int* src,int up_load)
{
    if(NULL == src)
    {
            printf("[Error]:input is NULL!func:%s Line:%d\n\r",__FUNCTION__,__LINE__);
            return -1;
    }

    int tmp=-1,point=0;

    while(point < IN_BUF_SIZE)
    {
            if(*(src+point) < up_load && -1 != *(src+point))
            {
                    if(tmp < *(src+point))
                            tmp = *(src+point);
            }
            point++;
    }

    point = 0;
    /* 将已用的数字置为-1 */
    while(point < IN_BUF_SIZE)
    {
            if(tmp == *(src+point))
            {
                    *(src+point) = -1;
                    break;
            }
            point++;
    }

    return tmp;
}

void find_max_time(int* src)
{
    if(NULL == src)
    {
            printf("[Error]:input is NULL!func:%s Line:%d\n\r",__FUNCTION__,__LINE__);
            return;
    }

    int h_h=-1,h_l=-1;
    int m_h=-1,m_l=-1;
    int s_h=-1,s_l=-1;

    h_h = find_max(src,3);                  /* 小时高位范围:0-2 */
    if(2 == h_h)
            h_l = find_max(src,4);          /* 当时间高位是2的时候,低位最大只能到4 */
    else
            h_l = find_max(src,10);         /* 时间高位是0-1时,低位范围是0-9 */

    m_h = find_max(src,6);                  /* 分钟高位 */
    m_l = find_max(src,10);

    s_h = find_max(src,6);
    s_l = find_max(src,10);

    if(-1 == h_h || -1 == h_l || -1 == m_h || -1 == m_l || -1 == s_h || -1 == s_l)
        printf("invalid!\n\r");                         //调试用h_h=%d,h_l=%d,m_h=%d,m_l=%d,s_h=%d,s_l=%d\n",h_h,h_l,m_h,m_l,s_h,s_l);
    else
        printf("%d%d:%d%d:%d%d\n",h_h,h_l,m_h,m_l,s_h,s_l);
}

void main()
{
    int input[IN_BUF_SIZE];
    memset(input,-1,sizeof(input));

    printf("[Input format]:[0,1,2,3,4,5]\n\r");
    scanf("[%d,%d,%d,%d,%d,%d]",&input[0],&input[1],&input[2],&input[3],&input[4],&input[5]);
    find_max_time(input);
}

测试结果

注意事项

时间翻转:24时翻转为0点。

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值