滴滴笔试编程IP地址题

<?php
$stdin = fopen('php://stdin','r');
$count = trim(fgets($stdin));
//var_dump($count);die();

for($i=1;$i<$count;$i++){
    $input[] = trim(fgets($stdin));
}
$inputBackup = $input;
//var_dump($input);
foreach($input as &$v){
    list($add,$num[]) = explode('/',$v);
    $add = explode('.',$add);
    foreach($add as &$_v){
        $_v = decbin($_v);
        $_v = str_pad($_v,8,"0",STR_PAD_LEFT);
    }
    $address[] = implode('',$add);
}

$j = 0;
foreach($address as $k => $v){
    ${'array'.$j}['value'] = substr($v,0,$num[$k]);
    ${'array'.$j}['key'] = $k;
    $j++;
}
$j--;
for($n=0;$n<=$j;$n++){
    for($m=0;$m<=$j;$m++){
        if($m != $n){
            if($num[$n] <= $num[$m]){
                $tmp = (substr(${'array'.$m}['value'],0,$num[$n]));
                if($tmp == ${'array'.$n}['value']){
                    unset(${'array'.$m});
                }
            }else{
                $tmp = (substr(${'array'.$n}['value'],0,$num[$m]));
                if($tmp == ${'array'.$m}['value']){
                    unset(${'array'.$n});
                }
            }
        }
    }
}

for($n=0;$n<=$j;$n++){
    if(isset(${'array'.$n})){
        $keys[] = ${'array'.$n}['key'];
    }
}

foreach($inputBackup as $k => $v){
    if(!in_array($k,$keys)){
        unset($inputBackup[$k]);
    }
}

$counting = count($inputBackup);
print($counting.'<br>');
foreach($inputBackup as $k => $v){
    print($v.'<br>');
}
?>
最后出来结果和测试用例比莫名其妙少了一组TuT 感觉就这样和AC擦肩而过了
6
192.168.0.0/16
172.50.137.225/32
202.139.219.192/32
192.183.125.71/32
201.45.111.138/32
172.24.0.0/17

#滴滴#
全部评论
我用trie树做的 第一题是用dp 做的
点赞 回复 分享
发布于 2017-10-09 22:33
我是把ip地址转成32位的二进制,然后XOR,看到比较短的那个掩码的位数是不是都是0,但是只过了60多,不知道为什么。 #include <iostream> #include <cstdio> #include <map> #include <string> #include <sstream> #include <vector> #include <set> #include <bitset> using namespace std; ostringstream ostr; struct ip_addr { bitset<32> s1,s2,s3,s4; unsigned int l; bitset<32> bin; }; int main(){ int n= 0; cin >> n; vector<ip_addr> ips; vector<string> ipstring; set<int> idx; for(int i = 0; i < n; i++){ ip_addr ip; unsigned int s1,s2,s3,s4,l; scanf("%d.%d.%d.%d/%d",&s1,&s2,&s3,&s4,&ip.l); ip.s1 = bitset<32>(s1); ip.s2 = bitset<32>(s2); ip.s3 = bitset<32>(s3); ip.s4 = bitset<32>(s4); ip.bin = ((ip.s1<<8 | ip.s2)<<8 | ip.s3)<<8 | ip.s4; ips.push_back(ip); bool flag =false; for(auto j:idx){ ip_addr tmp = ips[j]; unsigned int tmp_l = tmp.l; bool current_wider = tmp.l>ip.l; unsigned int len = current_wider?ip.l:tmp.l; string compare="00000000000000000000000000000000"; string _xor = (tmp.bin^ip.bin).to_string(); if(compare.substr(0,len) == _xor.substr(0,len)){ if(current_wider){ idx.erase(j); } else{ flag = true; } } } if(flag){ continue; } idx.insert(i); } cout<<idx.size()<<endl; for(auto j:idx){ ip_addr ip = ips[j]; cout<<ip.s1.to_ulong()<<'.'<<ip.s2.to_ulong()<<'.'<<ip.s3.to_ulong()<<'.'<<ip.s4.to_ulong()<<'/'<<ip.l<<endl; } return 0; }
点赞 回复 分享
发布于 2017-10-09 22:27
import java.util.*; public class Main{     public static void main(String[] args) throws Exception{         Scanner in = new Scanner(System.in);         int k = in.nextInt();         String[] cidr = new String[k];         for(int i = 0; i < k; i++){             cidr[i] = in.next();         }         String[] temp = new String[k];         for(int i = 0; i < k; i++){             temp[i] = "";         }         for(int i = 0; i < k; i++){             String[] arr = cidr[i].split("/");             String[] arr2 = arr[0].split("\\.");             for(int j = 0; j < arr2.length; j++){                 temp[i]+=String.format("%08d",Integer.parseInt(Integer.toBinaryString(Integer.parseInt(arr2[j]))));             }             temp[i] = temp[i].substring(0, Integer.parseInt(arr[1]));         }         boolean[] flag = new boolean[k];         int count = k;         for(int i = 0; i < k-1; i++){             for(int j = i+1; j < k; j++){                 if(flag[i]==true){                     break;                 }                 if(temp[i].indexOf(temp[j])==0){                     flag[i] = true;                     count--;                 }                 if(temp[j].indexOf(temp[i])==0){                     flag[j] = true;                     count--;                 }             }         }         System.out.println(count);         for(int i = 0; i < k; i++){             if(!flag[i]){                 System.out.println(cidr[i]);             }         }     } }
点赞 回复 分享
发布于 2017-10-09 21:06
= =我这道AC了,然后另一道gg了
点赞 回复 分享
发布于 2017-10-09 21:05

相关推荐

上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
国企上岸了的向宇同桌...:最害怕答非所问了,但是频繁反问确定意思又害怕面试官觉得我笨
AI时代还有必要刷lee...
点赞 评论 收藏
分享
肥肠椒绿:双非本可不就犯天条了,双非本就应该打入无间地狱
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务