zoukankan      html  css  js  c++  java
  • Groupon面经Prepare: Max Cycle Length

    题目是遇到偶数/2,遇到奇数 *3 + 1的题目,然后找一个range内所有数字的max cycle length。
    对于一个数字,比如说44,按照题目的公式不停计算,过程是 44, 22, 11, 8, 9 ,1(瞎起的),
    从44到1的这个sequence的长度,叫做cycle length。
    然后题目是给一个range,比如[2,300],求这里面所有数字的cycle length的最大值。follow up跑1到1 million

    package Sorting;
    import java.util.*;
    
    public class Solution2 {
        public List<Integer> maxCycleLen(int min, int max) {
            List<Integer> maxCycle = new ArrayList<Integer>();
            for (int i=min; i<=max; i++) {
                helper(maxCycle, i);
            }
            return maxCycle;
        }
        
        public void helper(List<Integer> maxCycle, int num) {
            int len = 1;
            while (num != 1) {
                if (num%2 == 1) num = num*3+1;
                else num = num/2;
                len++;
            }
            maxCycle.add(len);
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Solution2 sol = new Solution2();
            List<Integer> res = sol.maxCycleLen(1, 100000);
            System.out.println(res);
        }
    
    }
    

      

    follow up: 建立一个Lookup table, 算过的数就不算了

    package Sorting;
    import java.util.*;
    
    public class Solution3 {
        HashMap<Integer, Integer> map;
        public List<Integer> maxCycleLen(int min, int max) {
            List<Integer> maxCycle = new ArrayList<Integer>();
            map = new HashMap<Integer, Integer>();
            for (int i=min; i<=max; i++) {
                helper(maxCycle, i);
            }
            return maxCycle;
        }
        
        public void helper(List<Integer> maxCycle, int num) {
            int len = 0;
            int numcopy = num;
            while (!map.containsKey(num)) {
                if (num == 1) {
                    map.put(1, 1);
                    maxCycle.add(1);
                    return;
                }
                if (num%2 == 1) num = num*3+1;
                else num = num/2;
                len++;
            }
            len = len + map.get(num);
            maxCycle.add(len);
            map.put(numcopy, len);
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Solution3 sol = new Solution3();
            List<Integer> res = sol.maxCycleLen(1, 100000);
            System.out.println(res);
        }
    
    }
    

      

  • 相关阅读:
    url 路径的拼接
    java 实现导出Excel文件
    window 使用频率最高的快捷键
    jeesite 框架的简单应用
    一个软件开发者的解决问题的心得——善于利用蛛丝马迹
    在linux上安装dotnetcore
    c#多线程同步之EventWaitHandle使用
    sharepoint 2013 安装
    模板模式的应用
    正则表达式的应用
  • 原文地址:https://www.cnblogs.com/apanda009/p/7790627.html
Copyright © 2011-2022 走看看