LeetCode 535. Encode and Decode TinyURL (java)

原创 2018年01月11日 07:47:07

题目:

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.

解法一:我的解法

我们需要将原来的网址String s用一串符号String result代替,encode的时候把设计好的result和s放进hashmap中, 然后变成“http://tinyurl.com/result”的短url,这样在decode的时候就可以直接通过result在hashmap中获取原来String s的地址。那么重点在于我们如果对s得到result的字符串。下面的代码是我的方法,每次都随机从s中挑选三个字符,再加上从Integer.MIN_VALUE开始到Integer.MAX_VALUE的一个数字,这样的好处是:1. 可以保证hashmap里的key不会重复,因为每个字符串都有一个不同的数字,并且这个short url不会被预测,LeetCode的solution里有一个直接用0~(2^32-1)的数字进行编码的答案,虽然简单易行,但是非常容易被人猜到下一个url或者是获取所有的url。2. 操作简单,代码很短。局限:1. 最多只能解决(2^32 )个url地址,如果overflow的话,会覆盖之前的url,造成数据损失。2. shorten之后的short url长度并不一定会比原url短,取决于出现的顺序,result的长度为4~13位不等。

Java 代码:

public class Codec {
    HashMap<String,String> map = new HashMap<>();
    Random rand = new Random();
    int index = Integer.MIN_VALUE;

    // Encodes a URL to a shortened URL.
    public String encode(String longUrl) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 3; i++) {
            sb.append(longUrl.charAt(rand.nextInt(longUrl.length())));
        }
        sb.append(index++);
        map.put(sb.toString(), longUrl);
        return "http://tinyurl.com/" + sb.toString();
    } 

    // Decodes a shortened URL to its original URL.
    public String decode(String shortUrl) {
        return map.get(shortUrl.replace("http://tinyurl.com/",""));
    }
}

解法二:用定长编码来解

好处: 1. 每次的result都是n位的,同时能代表的url个数是62^n, 并且tiny url是不可预测的。

代码:(n=6)


public class Codec {
    String alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    HashMap<String, String> map = new HashMap<>();
    Random rand = new Random();
    String key = getRand();

    public String getRand() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 6; i++) {
            sb.append(alphabet.charAt(rand.nextInt(62)));
        }
        return sb.toString();
    }

    public String encode(String longUrl) {
        while (map.containsKey(key)) {
            key = getRand();
        }
        map.put(key, longUrl);
        return "http://tinyurl.com/" + key;
    }

    public String decode(String shortUrl) {
        return map.get(shortUrl.replace("http://tinyurl.com/", ""));
    }
}

解法三:hashCode()

直接用系统的longUrl.hashCode()函数作为result,缺点是会出现hash collision, 正如生日悖论(birthday paradox)那样。当有100,000个object出现后,collision的概率就会达到50%。

public class Codec {
    Map<Integer, String> map = new HashMap<>();

    public String encode(String longUrl) {
        map.put(longUrl.hashCode(), longUrl);
        return "http://tinyurl.com/" + longUrl.hashCode();
    }

    public String decode(String shortUrl) {
        return map.get(Integer.parseInt(shortUrl.replace("http://tinyurl.com/", "")));
    }
}

同理,用random()来产生随机数的方法和hashcode一样,可能会出现collision,如果url数量不大的话,这两种也是可行的方案。

Java学习指南系列(Java快速入门)

这是Java学习指南系列课程的第1篇,介绍Java语言的入门语法,引领希望学习Java语言编程的初学者进入Java大门。本课程不需要其他语言作为基础,可以直接学习。课程从Java开发平台的下载和安装开始,从浅到深、从易到难,循序渐进地进行语法讲解。为了让学员更好的掌握Java语言,本课程配套在线的Java题库及答案解析。相比于其他语言,Java语言更科学、更容易掌握,快来和大家一起学习Java吧。
  • 2017年08月09日 15:30

535 Encode and Decode TinyURL

url 长短两个类型的转化,初一看题意并不明确,不知道是否要保留http://  但参考了别人的答案后发现,其实并不需要,就是相当于一个长字符串和短字符串 之间建立一一对应的关系,其实就相当于字符和...
  • laserljy123
  • laserljy123
  • 2017-03-16 11:03:20
  • 1524

leetcode 535. Encode and Decode TinyURL(长短网址互译)

TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/desi...
  • a731604348
  • a731604348
  • 2017-04-13 00:38:11
  • 1074

python--leetcode 535. Encode and Decode TinyURL

TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/desi...
  • wenqiwenqi123
  • wenqiwenqi123
  • 2017-10-03 10:56:02
  • 623

leetcode题解-535. Encode and Decode TinyURL

题目:TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/d...
  • liuchonge
  • liuchonge
  • 2017-03-07 14:46:10
  • 2568

【LeetCode】535. Encode and Decode TinyURL

这几天陆续听说同学们都在刷LeetCode,是面试必须的。听完我也坐不住了,决定开始刷起来。先在知乎看了一遍,大部分人都是按照AC rate从高到低刷,那么我也就这么办吧。同学还建议直接在网页上写代码...
  • mrbcy
  • mrbcy
  • 2017-03-14 10:45:11
  • 3229

leetcode 535. Encode and Decode TinyURL

public class Codec { //还是利用HashMap,将longUrl和shortUrl对应起来 //建立两个hashMap Map LongUrlToShor...
  • sunno_ya
  • sunno_ya
  • 2017-04-20 20:11:41
  • 479

535. Encode and Decode TinyURL

题目Note: This is a companion problem to the System Design problem: Design TinyURL. TinyURL is a URL ...
  • toyijiu
  • toyijiu
  • 2017-03-05 22:06:37
  • 1201

LeetCode:535. Encode and Decode TinyURL

Given a non-empty integer array of size n, find the minimum number of moves required to make all arr...
  • u012655441
  • u012655441
  • 2017-03-23 19:02:22
  • 361

20170613-leetcode-535-Encode and Decode TinyURL

1.Description Note: This is a companion problem to the System Design problem: Design TinyURL. Tiny...
  • u010105243
  • u010105243
  • 2017-06-13 10:36:33
  • 646
收藏助手
不良信息举报
您举报文章:LeetCode 535. Encode and Decode TinyURL (java)
举报原因:
原因补充:

(最多只允许输入30个字)