• FB面经prepare: Count the number of Vector


    给一个超级大的排好序的vector  [abbcccdddeeee]比如,要求返回[{1,a}, {2,b}, {3,c}, {4,d}, {5,e}......]复杂度要优于O(N)

    分析:

    如果是binary search找每个char的上下界,worst case要找n次,时间复杂度O(nlogn)

    所以考虑每次比较start point和start point + 2^n位置上的数,假如一样就continue,不一样就在区间里面binary search找上界,这样worst case O(N)

     1 package fb;
     2 
     3 import java.util.*;
     4 
     5 public class ReorganizeVector {
     6     
     7     public List<List<Character>> reorganize(String str) {
     8         List<List<Character>> res = new ArrayList<List<Character>>();
     9         if (str==null || str.length()==0) return res;
    10         int starter = 0;
    11         int n = 0;
    12         while (starter < str.length()) {
    13             char cur = str.charAt(starter);
    14             int index = starter + (int)Math.pow(2, n);
    15             while (index < str.length() && str.charAt(index) == cur) {
    16                 n++;
    17                 index = starter + (int)Math.pow(2, n);
    18             }
    19             if (index >= str.length()) 
    20                 index = str.length() - 1;
    21             int rightEdge = findRight(str, starter, index, cur);
    22             List<Character> newItem = new ArrayList<Character>();
    23             newItem.add((char)('0'+ rightEdge-starter+1));
    24             newItem.add(cur);
    25             res.add(newItem);
    26             
    27             starter = rightEdge + 1;
    28             n = 0;
    29         }
    30         return res;
    31     }
    32     
    33     public int findRight(String str, int starter, int end, char target) {
    34         int l = starter;
    35         int r = end;
    36         while (l <= r) {
    37             int m = (l + r)/2;
    38             if (str.charAt(m) == target)
    39                 l = m + 1;
    40             else r = m - 1;
    41         }
    42         return r;
    43     }
    44 
    45     /**
    46      * @param args
    47      */
    48     public static void main(String[] args) {
    49         // TODO Auto-generated method stub
    50         ReorganizeVector sol = new ReorganizeVector();
    51         List<List<Character>> res = sol.reorganize("abbcccddddeeeee");
    52         for (List<Character> line : res) {
    53             for (Character c : line) System.out.print(c);
    54             System.out.println("");
    55         }
    56     }
    57 
    58 }
  • 相关阅读:
    asp.net 汉字转拼音类
    NET分页实现及代码
    Web.config配置文件详解(新手必看) (转载)
    偶开通博客啦
    转帖不会乱码的,powershell网络蜘蛛
    ConvertFrom-String 命令研究
    powershell玩转xml之20问
    powershell 判断操作系统版本 命令
    powershell加win的dns服务器,解决网站负载均衡问题
    PowerShell并发控制-命令行参数之四问
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/6399857.html
Copyright © 2020-2023  润新知