兔子突然想准备面试的第一天

来源:互联网 发布:数据圈论坛怎么打开 编辑:程序博客网 时间:2024/04/29 01:37

还有一年半开始找工作,在此选择将收集到的面试题整理来看看吧,总归对自己有用的样子。

学长今天面试的时候给我发过来的题目,所以嘞,先从这个开始吧!!!

阿里巴巴的ODPS大数据处理平台可以启动一系列并发的作业,每个作业中存在一系列存在父子关系的任务。每个任务用一个三元组表示–(任务id,父任务id,执行开销),其中任务id是一个正整数(>0);父任务id为0表示根任务,每个作业存在一个唯一的根任务,并且,所有的任务,如果其父任务id不为0,那么必然是一个已经存在的根任务id;执行开销是一个正整数(>0)。系统中至少存在一个作业。
举例如下:
(1,0,2)(2,0,3)(3,1,2)(4,1,3)
对应的任务关系是:
简单的树状图
注:括号内的数字表示任务开销

很容易看出来,这些任务树构成了一个森林。每颗任务树有若干个叶子结点,从根节点到叶子结点的路径上所有的执行开销,称作叶子结点对应的任务的总开销。例如上面一共有3个叶子结点任务,分别是任务3,4和2,对应的总开销分别是4,5和3,总开销最大的叶子结点任务是4,对应的总开销是5。

最开始的想法就是用C语言写,毕竟好久都没有编码了,C语言丢到一个文件了里面看着也舒服,做算法,感觉C比Java舒服太多了惹。

#include <string.h>#include <stdio.h>#include <stdlib.h>struct node{    int number;    int parent;    int cost; };struct tree_node{    int parent;    int number;    int cost;    int leaf; };int main(){    //读取整行数据    char luo[100];    gets(luo);    //找到函数特点然后分割字符串    char division[]=")(";    //分割后的结果     char *result = NULL;    char num_list[10][100];    int i,j,k;    //进行分割 strtok不允许嵌套,嵌套的话就无法继续进行,所以先赋值,在进行嵌套     result=strtok(luo,division);    int data_num=0;    while(result!=NULL){        strcpy(num_list[data_num],result);        printf( "result is %s\n", result );        result = strtok( NULL, division );        data_num++;    }    /*    for(i=0;i<data_num;i++){        printf("%s",num_list[i]);    }*/    //定义struct结构体数据    struct node nodeT[data_num];     //对于每一个data_num进行分割    for(i=0;i<data_num;i++){        char division2[]=",";        result=strtok(num_list[i],division2);        int k=0;        while(result!=NULL){            //转化为int类型            int res_num;            res_num=atoi(result);            //分情况存储            if(k==0){                nodeT[i].number= res_num;             }else if(k==1){                nodeT[i].parent= res_num;             }else if(k==2){                nodeT[i].cost= res_num;                //也可以在这里执行 判断是否有子类的步骤,但是还是要等待所有数据都加在之后在进行                 k=-1;            }            printf( "result is %d\n", res_num);            result = strtok( NULL, division2);            k++;        }    }    //检验结果    for(i=0;i<data_num;i++){        printf("%d %d %d\n",nodeT[i].number,nodeT[i].parent,nodeT[i].cost);    }    //构建树结构,子类记住父类,父类记住子类是否有节点即可    struct tree_node TreeNode[data_num];    int max=0;     for(i=0;i<data_num;i++){        TreeNode[i].number= nodeT[i].number;        TreeNode[i].parent= nodeT[i].parent;        TreeNode[i].cost= nodeT[i].cost;        TreeNode[i].leaf=1;        for(j=0;j<data_num;j++){            //判断其是否是叶子节点            if(TreeNode[i].number==TreeNode[j].parent){                TreeNode[i].leaf=0;                break;            }         }        //最后整理数据 么么艹 这个点是叶子节点         if(TreeNode[i].leaf==1){            int total_cost=0;            int now_parent;            now_parent=TreeNode[i].parent;            total_cost+=TreeNode[i].cost;             while(now_parent!=0){                for(j=0;j<data_num;j++){                    //遍历,找到now_parent对应的parent                    if(TreeNode[j].number==now_parent){                        total_cost+=TreeNode[j].cost;                        now_parent=TreeNode[j].parent;                    }                }            }            if(max<total_cost){                max=total_cost;            }        }    }    printf("最多消耗为%d",max);}

我运行起来,没有什么太大问题的样子,如果出现问题,在修改就是了。
明天研究下Java怎么弄,大致思想懂了的话,其实没啥问题。

别人写的JAVA,明天研究,么么艹

原创粉丝点击