leetcode题解-535. Encode and Decode TinyURL

来源:互联网 发布:喝酒的好处知乎 编辑:程序博客网 时间:2024/05/18 00:48

题目:TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/design-tinyurl and it returns a short URL such as http://tinyurl.com/4e9iAk.
Design the encode and decode methods for the TinyURL service. There is no restriction on how your encode/decode algorithm should work. You just need to ensure that a URL can be encoded to a tiny URL and the tiny URL can be decoded to the original URL.
这道题也是新加的,目的是实现URL短连接,最常见的是微博,因为微博中每条博文不得超过140字,所以想要分享链接时就必须使用短连接。那么如何实现呢?一种最简单直接的方法,就跟CSDN博客一样,就从0开始往上叠加即可,因为测试用例只用几百条,所以这种方法就钻了这个空子,可以accept。但是并未向题目描述所言使用大小写的英文字母。代码入下:

    List<String> url = new ArrayList<>();    // Encodes a URL to a shortened URL.    public String encode(String longUrl) {        url.add(longUrl);        return "http://tinyurl.com/" + (url.size()-1);    }    // Decodes a shortened URL to its original URL.    public String decode(String shortUrl) {        String[] ss = shortUrl.split("/");        int n = Integer.parseInt(ss[ss.length-1]);        return url.get(n);    }

另外一种思路就是按照题目的要求,将长短链接进行一一映射,那么如何实现这个映射算法,才能保证编解码的唯一性呢??我们可以使用两个Map来分别保存,

Map<Integer, String> map1=new HashMap<Integer, String>();    Map<String, Integer> map2=new HashMap<String, Integer>();    String s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";    // Encodes a URL to a shortened URL.    public String encode1(String longUrl) {        if(!map2.containsKey(longUrl)) {            map1.put(map1.size()+1,longUrl);            map2.put(longUrl, map2.size()+1);        }        int n=map2.get(longUrl);        StringBuilder sb=new StringBuilder();        //首先每个longUrl的索引n是不同的,可以使用对62的商和余数唯一标识n,然后将s中相应位置的字符插入短连接即可。        while(n>0) {        //共有62个字符可以用于短连接的编码            int r=n%62;            n/=62;            sb.insert(0,s.charAt(r));        }        return sb.toString();    }    // Decodes a shortened URL to its original URL.    public String decode1(String shortUrl) {        int val=0;        int n=shortUrl.length();        for(int i=0;i<n;i++) {            val=val*62+s.indexOf(shortUrl.charAt(i));        }        return map1.get(val);    }
0 0
原创粉丝点击