习题(一)

字符串中包含数字、'+'、'-'、'\'、'*', 输出int结果

思路:
将String转成ascii码(效率高),来解析字符串中的算数公式

    private static final Map map = new HashMap<>();

    static {
        //预先缓存好ascii码对应的数字和运算符
        map.put((byte) 48, 0);
        map.put((byte) 49, 1);
        map.put((byte) 50, 2);
        map.put((byte) 51, 3);
        map.put((byte) 52, 4);
        map.put((byte) 53, 5);
        map.put((byte) 54, 6);
        map.put((byte) 55, 7);
        map.put((byte) 56, 8);
        map.put((byte) 57, 9);
        map.put((byte) 43, 43);
        map.put((byte) 45, 45);
        map.put((byte) 47, 47);
        map.put((byte) 42, 42);
    }

    public static void main(String[] args) {
        System.out.println(calculate("121-17+41/2*3"));
    }

    private static int calculate(String formula) {
        final byte[] data = formula.getBytes();
        int result = 0;//结果
        int temp = 0;//字符串中每个数字
        int sign = 43;//字符串中每个运算符
        for (byte b : data) {
            final Integer n = map.get(b);//b为每个字符的ascii码
            if (n == 43) {
                result = getFinalNumber(sign, temp ,result);
                sign = 43;
                temp = 0;
            } else if (n == 45) {
                result = getFinalNumber(sign, temp ,result);
                sign = 45;
                temp = 0;
            } else if (n == 47) {
                result = getFinalNumber(sign, temp ,result);
                sign = 47;
                temp = 0;
            } else if (n == 42) {
                result = getFinalNumber(sign, temp ,result);
                sign = 42;
                temp = 0;
            } else {
                temp *= 10;
                temp += n;
            }
        }
        return getFinalNumber(sign, temp ,result);
    }

    //根据运算符来累计计算结果
    private static int getFinalNumber(int sign, int temp, int result) {
        if (sign == 43) {
            return result + temp;
        } else if (sign == 45) {
            return result - temp;
        } else if (sign == 47) {
            return result / temp;
        } else if (sign == 42) {
            return result * temp;
        }
        return 0;
    }

列出集合中所有子集

思路:
从第一个元素开始,列出所有包含第一个元素的子集,
再从第二个元素开始,列出所有包含第二元素但不包含前面元素的子集
...
以此类推

    public static void main(String[] args) {
        List list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        loop(new ArrayList<>(), list, 0);
    }

    /**
     *  列出所有包含head集合的子集,然后给head添加后继元素,并递归调用
     *
     *  head:已经列出的元素集合
     *  source:源集合    
     *  index:需要开始遍历的下标
     */
    private static void loop(List head, List source, int index) {
        loopChild(head, source, index);
        for (int i = index; i < source.size(); i++) {
            List second = new ArrayList<>(head);
            second.add(source.get(i));
            loop(second, source, i + 1);
        }
    }

    //列出所有包含head集合的子集
    private static void loopChild(List head, List source, int index) {
        for (int i = index; i < source.size(); i++) {
            final String e = source.get(i);
            head.add(e);
            System.out.println(head);
            head.remove(e);
        }
    }

你可能感兴趣的:(习题(一))