zoukankan      html  css  js  c++  java
  • 1075. 链表元素分类(25)

    原题: https://www.patest.cn/contests/pat-b-practise/1075

    思路: 这题真实把控制打印顺序用到了, 极致. 题目本身不是很复杂, 开个10万
    的结构体, 然后进行3波遍历, 把需要的数据打印出来就可以. 关键就是控制打印
    顺序. 主要就是仔细分析, 感觉我的代码复用性不好.

    实现:

    #include <stdio.h>
    
    #define LEN 100010
    struct Node {
        int data;
        int next;
    };
    typedef struct Node s_node;
    s_node node[LEN];
    
    int main (void) {
        int faddr;
        int len;
        int k;
        int taddr;
        int tdata;
        int tnext;
        int first1 = 1;
        int first2 = 1;
        int first3 = 1;
        int p;
        int i;
    
        scanf("%d %d %d", &faddr, &len, &k);
        for (i = 0; i < len; i++) {
            scanf("%d %d %d", &taddr, &tdata, &tnext);
            node[taddr].data = tdata;
            node[taddr].next = tnext;
        }
    
        // 第一波遍历, 打印 < 0 的数据
        p = faddr;
        while (p != -1) {
            if (node[p].data < 0) {
                if (first1 == 1) {
                    printf("%05d %d", p, node[p].data);
                    first1 = 0;
                } else {
                    printf(" %05d
    ", p);
                    printf("%05d %d", p, node[p].data);
                }
            }
            p = node[p].next;
        }
    
        // 第2波遍历, 打印 [0, k] 的数据
        p = faddr;
        while (p != -1) {
            if (node[p].data >= 0 && node[p].data <= k) {
                if (first1 == 0 && first2 == 1) {
                    printf(" %05d
    ", p);
                }
                if (first2 == 1) {
                    printf("%05d %d", p, node[p].data);
                    first2 = 0;
                } else {
                    printf(" %05d
    ", p);
                    printf("%05d %d", p, node[p].data);
                }
            }
            p = node[p].next;
        }
    
        // 第3波遍历, 打印 > k 的数据
        p = faddr;
        while (p != -1) {
            if (node[p].data > k) {
                if (
                    // 这个补刀有2种情况, 是测试点4
                    (first2 == 0 && first3 == 1) ||
                    (first2 == 1 && first1 == 0 && first3 == 1)
                ) {
                    printf(" %05d
    ", p);
                }
                if (first3 == 1) {
                    printf("%05d %d", p, node[p].data);
                    first3 = 0;
                } else {
                    printf(" %05d
    ", p);
                    printf("%05d %d", p, node[p].data);
                }
            }
            p = node[p].next;
        }
        printf(" -1
    "); // 20171125 1634 第1波刷题结束!
    
        return 0;
    }
    
    
  • 相关阅读:
    Android一些问题
    内存泄漏(Memory Leak)
    内存溢出OOM
    Android面试题集合
    Handler之同步屏障机制(sync barrier)
    IdleHandler 原理浅析
    OkHttp原理
    RxJava操作符
    Android电量优化全解析
    Android内存优化大盘点
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7898401.html
Copyright © 2011-2022 走看看