Leetcode535(设计短网址)

这篇文章介绍了如何使用Java实现LeetCode上的TinyURL编码和解码问题,通过两个哈希映射(longToShort和shortToLong)存储长网址与其对应的短网址,以及如何处理短网址冲突以确保唯一性。
摘要由CSDN通过智能技术生成
例题:



https://leetcode.cn/problems/encode-and-decode-tinyurl/description/

分析:

        题目要求可以将一个长网址变成一个短网址(encode),也可以通过短网址找到原来的长网址,我们可以使用两个hashMap集合来实现。 longToShort   和  shortToLong 两个集合。longToShort集合  的key为 长网址,  value为生成的短网址, 同时往shortToLong集合中加入key为短网址,value为原来的长网址。

代码实现:
static class CodecHashCode {

        private static final String PREFIX_URL = "http://tinyurl.com/";
        private static final Map<String,String> longToShort = new HashMap<>();
        private static final Map<String,String> shortToLong = new HashMap<>();

        // Encodes a URL to a shortened URL.
        public String encode(String longUrl) {
            String shortUrl = longToShort.get(longUrl);
            if(shortUrl != null){
                return shortUrl;
            }
            //当encode方法被调用多次后,生成的id可能相同,也就是短网址可能相同,需要先判断一下
            int id = longUrl.hashCode();
            while(true){
                shortUrl = PREFIX_URL + id;
                if(!shortToLong.containsKey(shortUrl)){
                    longToShort.put(longUrl, shortUrl);
                    shortToLong.put(shortUrl, longUrl);
                    break;
                }
                id++;
            }
            return longToShort.get(longUrl);
        }

        // Decodes a shortened URL to its original URL.
        public String decode(String shortUrl) {
            return shortToLong.get(shortUrl);
        }
    }

上一种方法要考虑生成的短网址冲突问题, 为了简化判断,可以用递增数来实现

        private static int id = 1;
        // Encodes a URL to a shortened URL.
        public String encode(String longUrl) {
            String shortUrl = longToShort.get(longUrl);
            if(shortUrl != null){
                return shortUrl;
            }
            shortUrl = PREFIX_URL + id;
            longToShort.put(longUrl, shortUrl);
            shortToLong.put(shortUrl, longUrl);
            id++;
            return longToShort.get(longUrl);
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值