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

来源:互联网 发布:js权威指南第七版pdf 编辑:程序博客网 时间:2024/05/01 14:05

华为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 <stdio.h>#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; i<len; i++)    {        if(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; i<m; i++)        system_task[i] = small[i].index;    system_task[m] = -1;    for(i=0; i<n; i++)        user_task[i] = big[i].index;    user_task[n] = -1;}

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 <stdio.h>#include <string.h>#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<j-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;}
0 0
原创粉丝点击