zoukankan      html  css  js  c++  java
  • Shorten IPv6 Address

    题目链接

    题意:转换一个128位的二进制串,变成16进制,并且格式为x:x:x:x:x:x:x:x然后多个相邻的0变成::,且只有一个::,求变成的字典序最小且最短的字符串。

    思路:大水题,但是就是一直wa,思路都一样的还是wa。先将二进制转化为十进制,然后用%x输出,因为连续的0可变短,但有优先级,首先选0长的,然后如果长度相等,先选中间,中间里面先选中间偏后,然后是最后,最后是前面。差不多就这意思吧。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<queue>
    #define ll long long
    using namespace std;
    const int N = 1000 + 10;
    char s[N];int a[10], r[10];
    int main() { 
        int T;   
        scanf("%d", &T);  
        for (int tii = 1; tii <= T; tii++) {
            scanf("%s", s + 1);    
            for (int i = 1; i <= 8; i++) {
                a[i] = 0;         
                for (int j = 1; j <= 16; j++) {
                    a[i] = a[i] * 2 + s[(i - 1) * 16 + j] - '0';
                }      
            }      
            memset(r, 0, sizeof(r)); 
            printf("Case #%d: ", tii);    
            int id = 0;      
            for (int i = 8; i > 0; i--) {  
                if (a[i] == 0) r[i] = r[i + 1] + 1;    
                if (r[id] < r[i]) id = i;       
                if (r[id] == r[i] && r[id] + id - 1 == 8 && i != 1) id = i;
            }        for (int i = 1; i <= 8; i++) { 
                if (id == i && r[i] >= 2) {         
                    if (id == 1) 
                    printf(":");       
                    printf(":");         
                    i += r[id] - 1;  
                }
                else {  
                    printf("%x", a[i]);
                    if (i != 8)
                    printf(":");  
                }    
            }     
            printf("
    ");   
        }  
        return 0;
    }
  • 相关阅读:
    .net经典笔试题
    asp.net面试题
    Java 面 试 题
    .net面试题集
    J2EE面试题集锦
    linux下查看硬件信息
    linux下软件的安装[转]
    在Linux系统下优化Oracle具体步骤
    制作Linux的优盘启动盘
    两端对齐,图片文字列表
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/11296166.html
Copyright © 2011-2022 走看看