• 九度 1402 特殊的数


    普通的方法:

    package com.wangzhu.njupt;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.StreamTokenizer;
    
    /**
     * 由于输入的数在1~100000之间,故只需要开个100000大小的数组,判断其是否存在即可
     * 
     * @ClassName: Main1402
     * @Description: TODO
     * @author 王竹
     * @date 2014-10-3 下午5:21:31
     * 
     */
    public class Main1402 {
    
        private static final int LEN = 1000001;
    
        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
            // System.setIn(new FileInputStream("data.in"));
            // 输入优化
            StreamTokenizer in = new StreamTokenizer(new BufferedInputStream(
                    System.in));
            // Scanner cin = new Scanner(new BufferedInputStream(System.in));
            // while (cin.hasNext()) {
            while (in.nextToken() != StreamTokenizer.TT_EOF) {
                int[] arr = new int[LEN];
                // int n = cin.nextInt();
                int n = (int) in.nval;
                int m = -1;
                for (int i = 0; i < n; i++) {
                    // m = cin.nextInt();
                    in.nextToken();
                    m = (int) in.nval;
                    arr[m]++;
                }
                StringBuilder sb = new StringBuilder();
                int c = 0, index = 0;
                for (int i = 1; i < LEN; i++) {
                    if (arr[i] == 1) {
                        if (index == 0) {
                            sb.append(i);
                            index = 1;
                        } else {
                            sb.append(" ").append(i);
                        }
                        c++;
                    }
                }
                System.out.println(c);
                if (c > 0) {
                    System.out.println(sb);
                }
    
            }
        }
    }

    位存储的方法:

    package com.wangzhu.njupt;
    
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.io.StreamTokenizer;
    import java.util.Scanner;
    
    public class Main14022 {
    
        /**
         * 用位来存储数
         */
        private static final int LEN = (1000000 >> 3) + 10;
        /**
         * 用于模8,即与7
         */
        private static final int MASK = (1 << 3) - 1;
        /**
         * 要查的数的范围为1~1000000
         */
        private static final int SIZE = 1000001;
    
        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
            // System.setIn(new FileInputStream("data.in"));
            // Scanner cin = new Scanner(new BufferedInputStream(System.in));
            // 输入优化
            StreamTokenizer in = new StreamTokenizer(new BufferedInputStream(
                    System.in));
            // 输出优化
            PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
            // while (cin.hasNext()) {
            while (in.nextToken() != StreamTokenizer.TT_EOF) {
                int[] arr = new int[LEN];
                int[] flag = new int[LEN];
                // int n = cin.nextInt();
                int n = (int) in.nval;
                for (int i = 0; i < n; i++) {
                    // int m = cin.nextInt();
                    in.nextToken();
                    int m = (int) in.nval;
                    // 其实是除以8
                    int index = m >> 3;
                    // 其实是模8
                    int bit = m & MASK;
                    if ((arr[index] & (1 << bit)) == 0) {
                        // 记录输入中的数
                        arr[index] |= (1 << bit);
                    } else if ((flag[index] & (1 << bit)) == 0) {
                        // 记录输入多个同样的数
                        flag[index] |= (1 << bit);
                    }
                }
                int cnt = 0;
                for (int i = 1; i < SIZE; i++) {
                    int index = i >> 3;
                    int bit = i & MASK;
                    if ((arr[index] & (1 << bit)) != 0
                            && (flag[index] & (1 << bit)) == 0) {
                        // 判断是输入的数并且只输入了一次
                        // 记录这种数的个数
                        cnt++;
                    }
                }
                StringBuilder sb = new StringBuilder();
                int j = 0;
                for (int i = 1; (i < SIZE) && (j < cnt); i++) {
                    int index = i >> 3;
                    int bit = i & MASK;
                    if ((arr[index] & (1 << bit)) != 0
                            && (flag[index] & (1 << bit)) == 0) {
                        sb.append(i).append(" ");
                        j++;
                    }
                }
                String ret = null;
                out.println(cnt);
                if (cnt > 0) {
                    ret = sb.substring(0, sb.length() - 1);
                    out.println(ret);
                }
                out.flush();
            }
        }
    }

    备注:

    关于位运算的一些补充:

    例如,

    关于n/8,可以转化为n>>3。

    关于n%8,可以转化为n&7,当然也已转化为n - (n>> 3)<<3。

  • 相关阅读:
    生成器
    迭代器
    装饰器
    Maven工具学习(六)----Maven依赖的版本锁定与版本常量
    SpringBoot学习记录之整合JSP
    SpringBoot学习记录之入门篇
    【k8s】ep-addresses
    【k8s】ep-metadata
    【k8s】Endpoints
    【k8s】cj-suspend
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/4005119.html
Copyright © 2020-2023  润新知