题目来源

TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://tinyurl.com/4e9iAk.

要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。

方法一:使用简单的计数

public class Codec {//根据次序存储加密前的urlprivate Map<Integer,String> map=new HashMap<>();int count=0;//加密后的url后面根的是加密的次序,解密时根据这个次序从map中查找就可以得到原urlpublic String encode(String longUrl) {map.put(count,longUrl);String shortUrl="http://tinyurl.com/"+count;count++;return shortUrl;}public String decode(String shortUrl) {int index = shortUrl.lastIndexOf("/");return map.get(Integer.valueOf(shortUrl.substring(index+1)));}
}

方法 2:使用出现次序加密

将url的出现次序看做62进制,将每一位映射到chars字符中,用对应的字符作为key,同时作为加密

class Codec {private String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";private HashMap<String, String> map = new HashMap<>();private int count = 0;public String getKey() {int c = count;StringBuilder sb = new StringBuilder();while (c > 0) {c--;sb.append(chars.charAt(c % 62));c /= 62;}return sb.toString();}public String encode(String longUrl) {String key = getKey();map.put(key, longUrl);count++;return "http://tinyurl.com/" + key;}public String decode(String shortUrl) {int index = shortUrl.lastIndexOf("/");return map.get(shortUrl.substring(index + 1));}
}

方法一和方法二存在的问题:

  • 可加密的数目依赖int
  • 加密后的不一定更短
  • 容易预测

方法三:使用HashCode

class Codec {private HashMap<Integer, String> map = new HashMap<>();public String encode(String longUrl) {Integer key = longUrl.hashCode();map.put(key, longUrl);return "http://tinyurl.com/" + key;}public String decode(String shortUrl) {int index = shortUrl.lastIndexOf("/");return map.get(Integer.valueOf(shortUrl.substring(index + 1)));}
}

特点:

  • 加密的数目依赖int,hashCode是int的
  • 加密后的长度与原来长度没有直接关系
  • 不同的url的hashCode可能相同
  • 不容易预测

方法四:使用随机数

class Codec {private HashMap<Integer, String> map = new HashMap<>();private Random random=new Random();public String encode(String longUrl) {Integer key =random.nextInt(Integer.MAX_VALUE);map.put(key, longUrl);return "http://tinyurl.com/" + key;}public String decode(String shortUrl) {int index = shortUrl.lastIndexOf("/");return map.get(Integer.valueOf(shortUrl.substring(index + 1)));}
}

特点:

  • 加密的数目依赖int
  • 加密后的长度与原来长度没有直接关系
  • 可能冲突
  • 不容易预测

方法五:随机固定长度加密

class Codec {String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";HashMap<String, String> map = new HashMap<>();Random rand = new Random();public String getRand() {StringBuilder sb = new StringBuilder();for (int i = 0; i < 6; i++) {sb.append(chars.charAt(rand.nextInt(62)));}return sb.toString();}public String encode(String longUrl) {String key = getRand();while (map.containsKey(key)) {key = getRand();}map.put(key, longUrl);return "http://tinyurl.com/" + key;}public String decode(String shortUrl) {int index = shortUrl.lastIndexOf("/");return map.get(shortUrl.substring(index + 1));}
}

特点:

  • 可加密数目大,也好扩展数目
  • 冲突可能小
  • 长度固定
  • 不可预测

总结
用一个map存原始url,key跟在加密后的url,解密根据这个key查找
不同的加密方法就是key的策略不同,从而影响可加密数量、长度、预测情况


http://www.taodudu.cc/news/show-3630488.html

相关文章:

  • TinyURL的实现原理
  • tinyurl_如何查看TinyUrl真正链接到的位置
  • 【535. TinyURL 的加密与解密】
  • 20、TinyURL 的加密与解密
  • 关于使得p标签以及span标签里面内容自动换行css实现
  • p标签中文字换行问题
  • li标签超出自动换行
  • 2021-06-29 工作记录--CSS-p标签自动换行 + p标签里不能放p标签
  • p标签自动换行问题
  • p标签设置文本自动换行
  • p标签英文不自动换行的问题
  • 解决P标签不会自动换行问题
  • HTML中P标签自动换行,浏览器补全P标签时的问题
  • P标签内容自动换行
  • bootstrap 中pre标签自动换行
  • div中p标签自动换行
  • html p自动换行超出省略,CSS自动换行、强制不换行、强制断行、超出显示省略号...
  • 设置p标签自动换行
  • html中p标签之间如何换行,用Javascript给文本段落加上p标签实现换行
  • p标签实现自动换行CSS
  • Python + Selenium + UnitTest自动化测试面试题目整理
  • 自动化测试面试题及答案(一)
  • 一些关于自动化测试面试问题
  • 自动化测试常见面试题-面经全套附答案
  • 16个自动化测试面试问题与解答
  • C++中链表与数组
  • 静态链表和数组的区别
  • 链表和数组的优缺点对比
  • C语言的链表和数组-诺禾
  • 数据结构——链表数组

TinyURL 的加密与解密相关推荐

  1. 535. TinyURL 的加密与解密 : 设计一个 URL 简化系统

    题目描述 这是 LeetCode 上的 「535. TinyURL 的加密与解密」 ,难度为 「中等」. Tag : 「哈希表」.「模拟」 TinyURL 是一种 URL 简化服务, 比如:当你输入一 ...

  2. leetcode-cpp 535.TinyURL的加密和解密

    535.TinyURL的加密和解密 题目: 链接 leetcode solution: 中等难度,总结来说就是看好题目意思就行,有个标志位能够用来区分长长长,mp<string,string&g ...

  3. 【535. TinyURL 的加密与解密】

    来源:力扣(LeetCode) 描述: TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl ...

  4. 【力扣每日一题】535. TinyURL 的加密与解密

    题目描述 535. TinyURL 的加密与解密 难度中等168 TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/d ...

  5. LeetCode中等题之TinyURL 的加密与解密

    题目 TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL h ...

  6. LeetCode 每日一题——535. TinyURL 的加密与解密

    1.题目描述 535. TinyURL 的加密与解密 TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design- ...

  7. Java实现 LeetCode 535 TinyURL 的加密与解密(位运算加密)

    535. TinyURL 的加密与解密 TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-tinyurl 时,它 ...

  8. ​LeetCode刷题实战535:TinyURL 的加密与解密

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  9. LeetCode 535. TinyURL 的加密与解密(哈希)

    文章目录 1. 题目信息 2. 哈希解题 1. 题目信息 TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-ti ...

最新文章

  1. Python函数及其参数
  2. C++大师Lippman:我对中国程序员的忠告
  3. C#读写word,文段及表格
  4. 大数据在未来十年将如何发展
  5. 对现代C++的一点看法
  6. 杀死应用进程 android,如何杀死Android应用程序启动的logcat进程?
  7. 精彩回顾 | Dapr闪电说系列
  8. element 下拉选择_猿实战18——商品发布之类目选择
  9. varnish构建高速缓存
  10. Apache 服务器 参数设置
  11. Unable to read TLD META-INF/c.tld from JAR file
  12. 理顺8个版本vue的区别
  13. Java爬虫爬取微博热搜榜
  14. 360全景拼接 opencv_全景拼接算法简介
  15. 看大神如何玩转微信小程序日历插件?
  16. 解决ArcGIS 报错:ERROR 999999: Error executing function.No spatial reference exists.No spatial reference
  17. 【Cocos Creator实战教程(6)】——镜头跟随
  18. AltiumDesigner PCB案牍(1)——Gerber文件的生成
  19. ardupilot java_基于Eclipse IDE的Ardupilot飞控源码阅读环境搭建
  20. edge通常不会下载xxxx确保信任xxx怎么解决

热门文章

  1. bitmap等比例缩小
  2. 零基础入门深度学习(5) - 循环神经网络【转】
  3. 关于CAN通信速率设置
  4. EasyCVR替换版本后调用api接提示401报错是什么原因?
  5. TCO 节省高达 40% ,新疆农信以天合翔宇实现生产级信创场景建设
  6. 数据库还原失败,WITH MOVE 子句可用于重新定位一个或多个文件
  7. Pycharm查看已安装库以及快速安装各种python库
  8. MM ABAP采购资讯记录批量删除
  9. python输入任意数字,以升序排序(基础)
  10. hightchart标题变化,哇嘎嘎