华为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;
}