【两次过】Lintcode 232. 短网址

博客围绕长网址与短网址的转换展开,需实现将长网址转成以特定开头的短网址,以及将短网址转回长网址的方法。评测关注短网址key长度为6且字符有限制,两网址需一一对应。解题思路是用map存储匹配关系,随机取字符拼接短网址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出一个长网址,返回一个短网址。

你需要实现两个方法:

  • longToShort(url) 把一个长网址转换成一个以http://tiny.url/开头的短网址
  • shortToLong(url) 把一个短网址转换成一个长网址

你可以任意设计算法,评测只关心两件事:

  1. 短网址的key的长度应该等于6 (不算域名和反斜杠)。 可以使用的字符只有 [a-zA-Z0-9]. 比如: abcD9E
  2. 任意两个长的url不会对应成同一个短url,反之亦然。

样例

样例 1:

输入: shortToLong(longToShort("http://www.lintcode.com/faq/?id=10"))
输出: "http://www.lintcode.com/faq/?id=10"
解释: 
  longToShort()被调用时你可以返回任何短网址, 比如 "http://tiny.url/abcdef".
  或者 "http://tiny.url/ABCDEF" 也时可以的.

样例 2:

输入: 
  shortToLong(longToShort("http://www.lintcode.com/faq/?id=10"))
  shortToLong(longToShort("http://www.lintcode.com/faq/?id=10"))
输出: 
  "http://www.lintcode.com/faq/?id=10"
  "http://www.lintcode.com/faq/?id=10"

解题思路:

使用一个map存储短网址与长网址的匹配关系。对于生成短网址的6个字符可采用在存储所有符合要求的char数组中随机取6个字符拼接即可。

public class TinyUrl {
    private Map<String, String> map;
    private char[] chars;
    
    public TinyUrl(){
        map = new HashMap<>();
        chars = new char[62];
        
        //初始化char数组
        int i=0;
        for(; i<10; i++)
            chars[i] = (char)('0' + i);
        
        for(; i<36; i++)
            chars[i] = (char)('a' + i - 10);
            
        for(; i<62; i++)
            chars[i] = (char)('A' + i - 36);
    }
    /*
     * @param url: a long url
     * @return: a short url starts with http://tiny.url/
     */
    public String longToShort(String url) {
        // write your code here
        String shortString = buildShortString();
        
        if(!map.containsKey(shortString))
            map.put(shortString, url);
            
        return shortString;
    }

    /*
     * @param url: a short url starts with http://tiny.url/
     * @return: a long url
     */
    public String shortToLong(String url) {
        // write your code here
        return map.get(url);
    }
    
    private String buildShortString(){
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<6; i++)
            sb.append(chars[(int)(Math.random()*62)]);
        
        return "http://tiny.url/" + sb.toString();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值