昨天去参加了华为的校园招聘上机考试,题目一共三道,都比较简单,不要求算法效率,也不要求对所给数据的合法性作检测,主要还是注重基础知识的考察,和大家分享一下,希望对接下来的同学有所帮助。 1、选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。 函数接口 int cal_score(int score[], int judge_type[], int n) 2、给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。 例如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7, 9, 6, 1}; input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3} 函数接口 void sort(int input[[, int n, int output[]) 3、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,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} 函数接口 void scheduler(int task[], int n, int system_task[], int user_task[])
不过思路差不多的,随便写写了Q1
int cal_score(int score[], int judge_type[], int n) {
double v1 = 0;
double v2 = 0;
int n1 = 0;
int n2 = 0;
for (int i=0; i<n; i++) {
if (judge_type[i] == 1) {
v1 += score[i];
n1++;
} else {
v2 += score[i];
n2++;
}
}
if (n2 == 0) {
return (int)(v1/n1);
} else {
return (int)(0.6*v1/n1 + 0.4*v2/n2);
}
}Q2
void sort(int input[], int n, int output[]) {
int center = (n%2 == 0) ? n/2 + 1 : n/2;
for (int i=0; i<n; i++) {
for (int j=1, k=0; j<n-i; j++) {
if (input[j] > input[j-1]) {
k = input[j];
input[j] = input[j-1];
input[j-1] = k;
}
}
}
output[center] = input[0];
for (int i=1, j=center-1, k=center+1; i<n; i+=2) {
if (j >= 0) output[j--] = input[i];
if (k < n) output[k++] = input[i+1];
}
}Q3
void scheduler(int task[], int n, int system_task[], int user_task[]) {
int n1 = 0;
int n2 = 0;
for (int i=0, j=0, k=0; i<n; i++) {
if (task[i] < 50) {
system_task[j++] = i;
n1++;
} else {
user_task[k++] = i;
n2++;
}
}
for (int i=0; i<n1; i++) {
for (int j=1, k=0; j<n1-i; j++) {
if (task[system_task[j]] < task[system_task[j-1]]) {
k = system_task[j];
system_task[j] = system_task[j-1];
system_task[j-1] = k;
}
}
}
for (int i=0; i<n2; i++) {
for (int j=1, k=0; j<n2-i; j++) {
if (task[user_task[j]] < task[user_task[j-1]]) {
k = user_task[j];
user_task[j] = user_task[j-1];
user_task[j-1] = k;
}
}
if (task[user_task[n2-i]] > 255) {user_task[n2-i] = -1;}
}
}
改成
if (task[user_task[n2-i-1]] > 255) {user_task[n2-i-1] = -1;}
宝哥第二题的拿中间数下标确实不用分情况,会自动去余的~~话说回来第二题还是只能先排input再插入output么,一次便利能有好方法不
第二题一次遍历也不是不可以Q2
void sort(int input[], int n, int output[]) {
int center = n/2;
int max = 0x10000000; //int最小值
int index = 0;
for (int i=0; i<n; i++) { //每次查找下一个最大值
for (int j=0; j<n; j++) { //找到下一个最大值
if (input[j] > max) {
max = input[j];
index = j;
}
}
output[center + (i%2==0 ? 1 : -1)*(i+1)/2] = max; //排列最大值
input[index] = max = 0x10000000; //把最大值置成最小
}
}
public static void main(String[] args) {
HaweiQuestion q = new HaweiQuestion();
int[] input = {3, 6, 1, 9, 7, 8};
int[] output = new int[input.length];
q.sort(input, input.length, output);
for(int i=0;i<input.length;i++){
System.out.print(output[i]+" ");
}
System.out.println();
int[] task = {0, 30, 155, 1, 80, 300, 170, 40, 99};
int[] system_task = new int[task.length];
int[] user_task = new int[task.length];
q.scheduler(task, task.length, system_task, user_task);
}
/**
* 选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,
* judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,
* judge_type[i] == 2,表示大众评委,n表示评委总数。
* 打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),
* 然后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,
* 则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。
*/
public int cal_score(int score[], int judge_type[], int n) {
int proNum=0;
int peoNum=0;
int total=0;
int peoCount=0;
for(int i=0;i<n;i++){
if(judge_type[i]==1){
proNum += score[i];
}else{
peoNum += score[i];
peoCount++;
}
}
if(peoCount!=0)
total = (int)(proNum * 0.6 + peoNum * 0.4);
else
total = proNum / n ;
return total;
}
/**
* 给定一个数组input[] ,如果数组长度n为奇数,
* 则将数组中最大的元素放到 output[] 数组最中间的位置,
* 如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,
* 然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。
* 例如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7, 9, 6, 1};
* input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3}
*/
public void sort(int input[], int n, int output[]){
//首先按从大到小的顺序排列input
for(int i=0; i < n;i++){
for(int j = i;j > 0;j--){
if(input[j] > input[j-1]){ //大数上浮
swap(input,j,j-1);
}
}
} int count = 0;
for (int i = n / 2, j = n / 2; i >= 0 && j < n; i--, j++) {
if (i == j) {
output[i] = input[count++];
} else {
output[i] = input[count++];
output[j] = input[count++];
}
}
if(n%2 == 0){ //偶数还有一个值
output[0] = input[count];
}
} private void swap(int[] input, int j, int i) {
int temp = input[j];
input[j] = input[j-1];
input[j-1] = temp;
}
/**
* 操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。
* 其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。
* 优先级大于255的为非法任务,应予以剔除。
* 现有一任务队列task[],长度为n,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}
*/
public void scheduler(int task[], int n, int system_task[], int user_task[]){
int[] indexs = new int[n]; //用来保存下标
for(int i=0;i<n;i++){ //初始化
indexs[i] = i ;
}
//按从小到大的顺序排列task
for(int i=0; i < n;i++){
for(int j = i;j > 0;j--){
if(task[j] < task[j-1]){ //小数上浮,相等不交换
swap(task,j,j-1);
swap(indexs,j,j-1); //同时交换下标
}
}
}
int sysPoint = 0;
int userPoint = 1;
for(int i=0;i<n;i++){
if(task[i] < 50){
system_task[sysPoint++] = indexs[i];
}else if(task[i]<=255){
user_task[userPoint++] = indexs[i];
}else{
//do nothing
}
}
}
}
void sort(int input[], int n, int output[])
{
int i,j,temp;
int a=0,b=1; for (i=n-1;i>=0;i--)
{
for (j=0;j<i;j++)
{
if (input[i]<input[j])
{
temp=input[i];
input[i]=input[j];
input[j]=temp;
}
} if ((n-1-i)%2==0)
{
output[n/2+a]=input[i];
printf("output[%d]=%d\n",n/2+a,output[n/2+a]);
a++;
}
else
{
output[n/2-b]=input[i];
printf("output[%d]=%d\n",n/2-b,output[n/2-b]);
b++;
}
}
}
//-------------------------------------------------------------
int cal_score(int score[], int judge_type[], int n)
{
int i=0,a=0,b=0; //一定要初始化
int a_score=0,b_score=0,last_score=0; //一定要初始化
for (i=0;i<n;i++)
{
if (judge_type[i]==1)
{
a_score+=score[i];
a++;
}
else
{
b_score+=score[i];
b++;
}
}
a_score/=a;
b_score/=b;
if (b==0)
{
last_score=a_score;
}
else
{
last_score=a_score*0.6+b_score*0.4;
}
return last_score;}//-------------------------------------------------------------
int max = 0x10000000; //int最小值
?这个不是啊
{
float sum1 = 0,sum2=0,lastscore,a_sum,b_sum;
int i = 0,j=0;
if(judge_type[i] == 1)
{
sum =score[i]+sum;
i++;
a_sum=sum/i-1;
}
if(judge_type==2)
{ sum2 = sum2 +score[j];
j++;
b_sum=sum2/j-1;
}
lastscore=(a_sum1*0.6+b_sum*0.4);}
{
int temp;
int i,j,k;
for(i = 0; i < n-1; i++)
{
for(j = i+1;j< n ;j++)
{
if(input[i]>input[j])
{
temp = input[i];
input[i] =input[j];
input[j]=temp;
}
}
}
for(i = 1; i < n; i++)
{
if(n%2!=0)
{
output[n/2]=input[n];
if(i/2!=0)
{
output(n/2-i) = input[n-i];
}
if(i/2 ==0)
{
output[n/2+i]=input[n-i];
}
}
else
{
output[n/2+1]=intput[n];
if(i/2!=0)
{
output(n/2+1-i) = input[n-i];
}
if(i/2 ==0)
{
output[n/2+1+i]=input[n-i];
}
} }
{
int temp;
int i,j,k;
for(i = 0; i < n-1; i++)
{
for(j = i+1;j< n ;j++)
{
if(input[i]>input[j])
{
temp = input[i];
input[i] =input[j];
input[j]=temp;
}
}
}
for(i = 1; i < n; i++)
{
if(n%2!=0)
{
output[n/2]=input[n];
if(i/2!=0)
{
output(n/2-i) = input[n-i];
}
if(i/2 ==0)
{
output[n/2+i]=input[n-i];
}
}
else
{
output[n/2+1]=intput[n];
if(i/2!=0)
{
output(n/2+1-i) = input[n-i];
}
if(i/2 ==0)
{
output[n/2+1+i]=input[n-i];
}
} }
#include<string.h>
using namespace std;
int cal_score(int score[],int judge_type[],int n)
{
int public_number=0;
int professor_sum=0;
int public_sum=0;
for(int i=0;i<n;i++)
{
if(judge_type[i]==1)
{
professor_sum+=score[i];
}
else if(judge_type[i]==2)
{
public_number+=1;
public_sum+=score[i];
}
}
if(public_number==0)
return professor_sum/n;
else
{
if(public_number<n)
{
return static_cast<int>(static_cast<int>(professor_sum/(n-public_number)*0.6)+static_cast<int>(public_sum/public_number*0.4));
}
//开始没有考虑到这个情况,思考要全面
else if(public_number==n)
{
return static_cast<int>(public_sum/public_number*0.4);
}
}
}
void sort_own(int input[],int n,int output[])
{
//时间复杂度,空间复杂度,都有待改善
int* t=new int[n];
memcpy(t,input,sizeof(int)*n);
//冒泡排序
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(t[j]>t[j+1])
{
//交换t[j],t[j]
t[j]^=t[j+1];
t[j+1]^=t[j];
t[j]^=t[j+1];
}
}
}
output[n/2]=t[n-1];
int left=n/2-1;
int right=n/2+1;
for(int i=n-2,j=1;i>=0;i--,j++)
{
if(j%2==1)
{
output[left]=t[i];
left--;
}
else
{
output[right]=t[i];
right++;
}
}
}
void scheduler(int task[],int n,int system_task[],int user_task[])
{
int** _task=new int*[n];
for(int i=0;i<n;i++)
{
_task[i]=new int[2];
_task[i][0]=i;
_task[i][1]=task[i];
}
//稳定的冒泡排序
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(_task[j][1]>_task[j+1][1])
{
int f=_task[j][0],s=_task[j][1];
_task[j][0]=_task[j+1][0];
_task[j][1]=_task[j+1][1];
_task[j+1][0]=f;
_task[j+1][1]=s;
}
}
}
int system_i=0,user_i=0;
for(int i=0;i<n;i++)
{
if(_task[i][1]<50)
{
system_task[system_i++]=_task[i][0];
}
//开始没有考虑>255的,现在考虑事情,总是漏掉一些
else if(_task[i][1]>=50&&_task[i][1]<=255)
{
user_task[user_i++]=_task[i][0];
}
}
system_task[system_i]=user_task[user_i]=-1;
}
void print(int a[])
{
int i=0;
while(a[i]!=-1)
{
cout<<a[i]<<endl;
i++;
}
}
int main()
{
//一个解法
/*第三题
int task[]={0,30,155,1,80,300,170,40,99};
int n=sizeof(task)/sizeof(*task);
int* system_task=new int[n];
int* user_task=new int[n];
scheduler(task,n,system_task,user_task);
print(system_task);
cout<<"---------"<<endl;
print(user_task);
*/
/*第二题
int input[]={};
int n=sizeof(input)/sizeof(*input);
int* output=new int[n];
sort_own(input,n,output);
for(int i=0;i<n;i++)
cout<<output[i]<<endl;
*/
/* 第一题
int score[]={12,10};
int judge_type[]={2,2};
int n = sizeof(score)/sizeof(*score);
cout<<cal_score(score,judge_type,n)<<endl;
*/ return 0;
}
public class TaskTest{
public static void main(String[] agrs){
int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99};
int[] system_task = new int[5];
int[] user_task = new int[5];
int n = task.length;
print(task);
System.out.println();
scheduler(task,n,system_task,user_task);
print(system_task);
System.out.println();
print(user_task);
}
static void scheduler(int task[], int n, int system_task[], int user_task[]){
int sysIdx = 0;
int userIdx = 0;
for(int i=0;i<n;i++){
if(task[i]<50){
system_task[sysIdx] = i;
sysIdx++;
if(sysIdx==system_task.length-1){
system_task[sysIdx] = -1;
}
}else if(task[i]<=255){
user_task[userIdx] = i;
userIdx++;
if(userIdx==user_task.length-1){
user_task[userIdx] = -1;
}
}else{
//do nothing
}
}
}
public static void print(int[] arrs){
int leng = arrs.length;
for(int i=0;i<arrs.length;i++){
if(i==0){
System.out.print("[");
}
if(i==leng-1){
System.out.print(arrs[i]+"]");
break;
}
System.out.print(arrs[i]+",");
}
}
}
int input[] ={3, 6, 1, 9, 7, 8} ;
int output[] = new int[input.length];
sort(input, input.length, output); } public static void sort(int input[], int k, int output[]) {
//插入排序
for (int n = 0; n < input.length;n++) {
int max = 0;
int index = 0;
for (int i = n; i < input.length; i++) {
if (input[i] > max) {
max = input[i];
index = i;
}
}
int temp = input[n];
input[n] = max;
input[index] = temp;
}
//打印
for (int l : input) {
System.out.print(l);
}
System.out.print("\n");
for(int i=0;i<input.length;i++){
if(i%2==0){
output[output.length/2+i/2] = input[i];
}else{
output[output.length/2-i/2-1] = input[i];
}
}
for (int l : output) {
System.out.print(l);
}
}
}