Encode and Decode TinyURL
设计一个TinyURL. 这个设计题的关键是如何打散字符串, 并且还能重新组合起来. 首先用index和revindex来做bimap, 储存url. 然后encode方法中, 先看revindex有没有, 没有的话我们用Math.random打散url作为key, 并且检查index里有没有. decode就是在index里找shortUrl对应的url.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public class Codec { Map<String, String> index = new HashMap<String, String>(); Map<String, String> revIndex = new HashMap<String, String>(); static String BASE_HOST = "http://tinyurl.com/"; // Encodes a URL to a shortened URL. public String encode(String longUrl) { if (revIndex.containsKey(longUrl)) return BASE_HOST + revIndex.get(longUrl); String charSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; String key = null; do { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 6; i++) { int r = (int) (Math.random() * charSet.length()); sb.append(charSet.charAt(r)); } key = sb.toString(); } while (index.containsKey(key)); index.put(key, longUrl); revIndex.put(longUrl, key); return BASE_HOST + key; } // Decodes a shortened URL to its original URL. public String decode(String shortUrl) { return index.get(shortUrl.replace(BASE_HOST, "")); } } |