leetcode题解-535. Encode and Decode TinyURL

题目: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值