首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 换工作是一件经过深思熟虑的严肃事情
• 频繁换工作是 loser 做的事情
• 公司应该提供给员工尽可能好的条件
• 这里不欢迎苦大仇深的公司
• 原则上这里不欢迎猎头发帖,除非是懂技术的猎头
• 如果你自己从来没有从期权上赚过钱,就不要在招聘时强调期权
• 招聘时请尽量给出薪酬范围
• 求职时请附上自己的薪酬要求
• 说话前经过足够的思考是好习惯
• 上传一个有意义的头像会更体现你们公司的品牌和诚意
• 请不要在 1 天的时间内在酷工作节点发布超过 3 个主题
• 在不同节点下发布内容相同的主题这种行为不科学
拉勾
V2EX  ›  酷工作

一道面试题,求解

  •  
  •   lalala121 · 352 天前 · 1339 次点击
    这是一个创建于 352 天前的主题,其中的信息可能已经有所发展或是发生改变。

    已知有这么一个数组

    $a = array(
    	'a'      =>  1,
    	'b.b.c'  =>  2,
    	'b.b.d'  =>  3,
    	'b.b.e'  =>  4,
    	'f.g'    =>  5,
    );
    

    处理后变为

    $b = array(
        'a'    =>  1,
        'b'    =>   array(
            'b'     =>  array(
                'c' =>  2,
                'd' =>  3,
                'e' =>  4,
            ),
        ),
        'f'   =>    array(
            'g'     => 5,
        ),
    );
    

    请问该怎么处理,给点思路,谢谢

    10 回复  |  直到 2018-04-17 13:51:29 +08:00
        1
    namedfish   352 天前 via iPhone
    这结构看起来就像前缀树
        2
    johnhsm2333   352 天前 via Android
    单词查找树
        3
    blodside   351 天前 via Android
    字典树啊
        4
    4357   351 天前
    楼上的回答都不靠谱
    简单的做法,遍历原来的 map 的 key,用'.'切分成字符串数组,然后遍历这个数组,一层层建立 map
        5
    shenqi   351 天前
    看不懂,为啥数组还给 key,如果是对象,直接用 lodash.set 算不算作弊。
        6
    yunfeifan   351 天前
    姑且认为你给的是个 map 吧! 仅供参考一下!
    var test_arr = {
    'a': 1,
    'b.b.c': 2,
    'b.b.d': 3,
    'b.b.e': 4,
    'f.g': 5
    };


    expandArr = (arr) => {
    let res = {};
    let expand = (item, value) => {
    let paths = item.split('.');
    if (paths.length > 1) {
    setChild(res, paths, value);
    } else {
    res[paths[0]] = value;
    }
    }
    let setChild = (obj, paths, value) => {
    if (paths.length === 0) {
    return;
    }
    if (paths.length === 1) {
    obj[paths] = value;
    } else {
    if (!(paths[0] in obj)) {
    obj[paths[0]] = {};
    }
    setChild(obj[paths[0]], paths.slice(1,), value);
    }
    }
    for(let item of Object.keys(arr)){
    expand(item, arr[item]);
    }
    return res;
    }

    expandArr(test_arr)
        7
    enenaaa   351 天前
    直接写呗还能怎么处理
        8
    shenhhd   351 天前
    看语法有点像是 php 啊

    $a = array(
    'a' => 1,
    'b.b.c' => 2,
    'b.b.d' => 3,
    'b.b.e' => 4,
    'f.g' => 5,
    );



    $newarray=[];
    foreach($a as $k =>$value){
    $keys = explode('.',$k);
    $a=$value;
    $keys = array_reverse($keys);
    foreach($keys as $v){
    $a=[$v=>$a];
    }

    my_merge($newarray,$a);

    }



    function my_merge(&$a,$b){

    foreach($a as $key=>&$val){
    if(is_array($val) && array_key_exists($key, $b) && is_array($b[$key])){
    my_merge($val,$b[$key]);
    $val = $val + $b[$key];
    }else if(is_array($val) || (array_key_exists($key, $b) && is_array($b[$key]))){
    $val = is_array($val)?$val:$b[$key];
    }
    }
    $a = $a + $b;
    }



    print_r($newarray);
        9
    dan2001go   351 天前
    早上看了一下,本来想写的,结果时间来不及,要赶着去面试。。
    回来一看已经有人解答了,我写到一半,也贴出来吧,这个就是 PHP 了。
    思路都差不多,用递归的方式求解。这块水平好差。。有一次面试直接让我机试,心里紧张,磨了半天当场写不出来,估计别人觉得我水平太 LOW 了囧。


    <?php

    date_default_timezone_set('Asia/Shanghai');

    $a = array(
    'a' => 1,
    'b.b.c' => 2,
    'b.b.d' => 3,
    'b.b.e' => 4,
    'f.g' => 5,
    'b.q.e' => 6,
    );

    $obj = array();

    foreach($a as $k=>$v){
    $tree = explode('.',$k);
    if(count($tree)>1){
    $index = 1;
    if(!isset($obj[$tree[0]])){
    $obj[$tree[0]] = array();
    }
    loop($obj[$tree[0]],$tree,$index,$v);
    }else{
    $obj[$k] = $v;
    }
    }

    function loop(&$obj,$src,$index,$value){

    if($index == count($src)){
    return false;
    }
    if($index == count($src)-1){
    $tmp = $value;
    }else{
    $tmp = null;
    }
    $add = false;
    if(!is_null($obj)){
    if(array_key_exists($src[$index],$obj) === true){
    $add = true;
    }
    }

    if($add != true){
    $obj[$src[$index]] = $tmp;
    }

    $offset = $src[$index];
    $index++;
    loop($obj[$offset],$src,$index,$value);
    }

    var_dump($obj);
        10
    JackZong   337 天前
    @shenqi PHP
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1106 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 17:59 · PVG 01:59 · LAX 10:59 · JFK 13:59
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1