华为OJ题目 -- 初级篇(机试OJ平台)

华为OJ初级篇是本人搜集的一些题目,都run过OK,初级题我个人感觉必要在15-20min以内完成,不然时间不够用,一共三道,后两道中高级题目。
题目一:
操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越 高。
函数接口 void scheduler(int task[], int n, int system_task[], int user_task[])
函数scheduler实现如下功能:
将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),
并且优先级高的任务排在前面,数组元素为-1表示结束。

例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}
system_task[] = {0, 3, 1, 7, -1}
user_task[] = {4, 8, 2, 6, -1}

代码:
OJ.CPP

#include 
#include <string.h>
#include "oj.h"

void bubble_sort(struct elem *src, int len)
{
    int i,j;
    int temp;
    int flag =1;

    for(i=0;i<=len-2 && flag;i++)
    {
        flag = 0;
        for(j=0; j<=len-2-i; j++)
        {
            if(src[j].val > src[j+1].val)
            {
                temp = src[j].val;
                src[j].val = src[j+1].val;
                src[j+1].val = temp;

                temp = src[j].index;
                src[j].index = src[j+1].index;
                src[j+1].index = temp;

                flag = 1;
            }
        }
    }
}

void choose_sort(struct elem *src, int len)
{
    int i,j;
    int ch;
    int temp;

    for(i=0;i<=len-2;i++)
    {
        ch=i;
        for(j=i+1; j<=len-1; j++)
        {
            if(src[ch].val > src[j].val) ch = j;
        }
        if(i != ch)
        {
            temp = src[ch].val;
            src[ch].val = src[i].val;
            src[i].val = temp;

            temp = src[ch].index;
            src[ch].index = src[i].index;
            src[i].index = temp;

        }
    }
}

void scheduler(int task[], int len, int system_task[], int user_task[])
{
    struct elem small[100];
    struct elem big[100];
    int i;
    int m=0,n=0;

    for(i=0; iif(task[i]<0 || task[i]>255) continue;
        if(task[i]<50)
        {
            small[m].index = i;
            small[m].val = task[i];
            m++;
        }
        else
        {
            big[n].index = i;
            big[n].val = task[i];
            n++;
        }
    }
    bubble_sort(small,m);
    bubble_sort(big,n);

    for(i=0; i1;
    for(i=0; i1;
}

OJ.H

#ifndef __OJ_H__
#define __OJ_H__

/*
功能:

输入:

输出:

返回:
*/

void scheduler(int task[], int n, int system_task[], int user_task[]);

struct elem{
    int val;
    int index;
};

#endif

从这里大家也可以熟悉一下OJ考试平台,平台测试比较严格,很多同学反映自己在VS上测试都通过,但是一上OJ就出问题,首先我要说的是,不要怀疑OJ,毕竟很多人都过了,要坚信你代码要么写的不规范,要么入口或其他条件未判断。

这个题目比较坑,一开始我用选择排序,妈蛋的,居然在比如用例为:
int task[] = {255,255,0,-1,256,2,138}; 255,255的下标会交换,不得已改为冒泡好了。

题目二:
我国公民的身份证号码特点如下:
1、 长度为18位;
2、 第1~17位只能为数字;
3、 第18位可以是数字或者小写英文字母x。
4、 身份证号码的第7~14位表示持有人生日的年、月、日信息。

例如:511002198808080111或51100219880808011x。

请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,小于等于2100年。
需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。
其他情况的合法性校验,考生不用考虑。

函数返回值:
1) 如果身份证号合法,返回0;
2) 如果身份证号长度不合法,返回1;
3) 如果身份证号第1~17位含有非数字的字符,返回2;
4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3;
5) 如果身份证号的年信息非法,返回4;
6) 如果身份证号的月信息非法,返回5;
7) 如果身份证号的日信息非法,返回6(请注意闰年的情况);
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。

要求实现函数:
int verifyIDCard(char* input)
【输入】 char* input,表示输入的身份证号码字符串
【输出】 无
【返回】 判断的结果,类型为int

#include 
#include 
#include "oj.h"

int str2num(char *src, int len)
{
    int i;
    int res=0;
    int flag = 1;

    for(i=len-1; i>=0; i--)
    {
        res+= (src[i]-'0')*flag;
        flag *= 10;
    }
    return res;
}

int verifyIDCard(char *input)
{
    int i=0;
    int year,month,day;
    int len = strlen(input);

    if(len!=18) return 1;
    for(i=0;i<17;i++)
    {
        if(input[i]<'0' || input[i]>'9') return 2;
    }
    if((input[17]<'0' || input[17] >'9') && (input[17] != 'x'))return 3;

    year = str2num(input+6,4);
    month = str2num(input+10,2);
    day = str2num(input+12,2);

    if(year <1900 || year >2100) return 4;
    if(month<1||month>12) return 5;
    if(day<1||day>31) return 6;

    if(month==2)
    {
        if((year%4 == 0)&&(year%100 != 0) || (year%400 == 0))
        {
            if(day>29) return 6;
        }
        else
        {
            if(day>28) return 6;
        }
    }
    return 0;
}

题目三:
判断输入的字符串是不是一个有效的IP地址
详细描述:
请实现如下接口
boolisIPAddressValid(constchar* pszIPAddr)

输入:pszIPAddr 字符串
输出:true 有效的IP地址,false,无效的IP地址

约束
输入IP为XXX.XXX.XXX.XXX格式
字符串两端含有空格认为是合法IP
字符串中间含有空格认为是不合法IP
类似于 01.1.1.1, 1.02.3.4 IP子段以0开头为不合法IP
子段为单个0 认为是合法IP,0.0.0.0也算合法IP

#include "IPAddressValid.h"

int string2int(char *s, int len)
{
    int res=0;
    int f = 1;
    int i=0;

    for(i=len-1; i>=0; i--)
    {
        res = res + (s[i] - '0')*f;
        f = f*10;
    }

    return res;
}

bool isIPAddressValid(const char* pszIPAddr)
{
    // 请在此处实现
    int len=0,i=0,j=0,k=0;
    int count=0;
    char src[100] = {0};
    char s[10]={0};
    // 如果不加 就出现运行错误,他妈的
    if(pszIPAddr == 0 || pszIPAddr == "") return false; 
    while(pszIPAddr[len]) 
    {
        src[len] = pszIPAddr[len];
        len++;
    }
    src[len] = '\0';

    for(i=0;i<len;i++)
    {
        if((i==0 || i==len-1)&&(src[i] == ' ')) continue;
        if((src[i]<'0' || src[i] >'9')&& (src[i]!='.'&& src[i]!=' ')) return false; 

        s[j++] = src[i];

        if(src[i] == '.')       
        {   
            count++;
            if(src[i+1] == '.' || src[i+1] == '\0') return false;
            if(j>4) return false;
            if(j>2 && s[0] == '0') return false;
            for(k=0;k-1;k++)
            {
                if(s[k] == ' ') return false;
            }
            if(j==4)
            {
                if(string2int(s,3) > 255) return false;
            }
            j=0;
        }
    }
    if(count!=3) return false;
    return true;
}

你可能感兴趣的:(算法与数据结构)