TinyURL 的加密与解密
题目来源
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 的加密与解密相关推荐
- 535. TinyURL 的加密与解密 : 设计一个 URL 简化系统
题目描述 这是 LeetCode 上的 「535. TinyURL 的加密与解密」 ,难度为 「中等」. Tag : 「哈希表」.「模拟」 TinyURL 是一种 URL 简化服务, 比如:当你输入一 ...
- leetcode-cpp 535.TinyURL的加密和解密
535.TinyURL的加密和解密 题目: 链接 leetcode solution: 中等难度,总结来说就是看好题目意思就行,有个标志位能够用来区分长长长,mp<string,string&g ...
- 【535. TinyURL 的加密与解密】
来源:力扣(LeetCode) 描述: TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl ...
- 【力扣每日一题】535. TinyURL 的加密与解密
题目描述 535. TinyURL 的加密与解密 难度中等168 TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/d ...
- LeetCode中等题之TinyURL 的加密与解密
题目 TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL h ...
- LeetCode 每日一题——535. TinyURL 的加密与解密
1.题目描述 535. TinyURL 的加密与解密 TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design- ...
- Java实现 LeetCode 535 TinyURL 的加密与解密(位运算加密)
535. TinyURL 的加密与解密 TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-tinyurl 时,它 ...
- LeetCode刷题实战535:TinyURL 的加密与解密
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...
- LeetCode 535. TinyURL 的加密与解密(哈希)
文章目录 1. 题目信息 2. 哈希解题 1. 题目信息 TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-ti ...
最新文章
- Python函数及其参数
- C++大师Lippman:我对中国程序员的忠告
- C#读写word,文段及表格
- 大数据在未来十年将如何发展
- 对现代C++的一点看法
- 杀死应用进程 android,如何杀死Android应用程序启动的logcat进程?
- 精彩回顾 | Dapr闪电说系列
- element 下拉选择_猿实战18——商品发布之类目选择
- varnish构建高速缓存
- Apache 服务器 参数设置
- Unable to read TLD META-INF/c.tld from JAR file
- 理顺8个版本vue的区别
- Java爬虫爬取微博热搜榜
- 360全景拼接 opencv_全景拼接算法简介
- 看大神如何玩转微信小程序日历插件?
- 解决ArcGIS 报错:ERROR 999999: Error executing function.No spatial reference exists.No spatial reference
- 【Cocos Creator实战教程(6)】——镜头跟随
- AltiumDesigner PCB案牍(1)——Gerber文件的生成
- ardupilot java_基于Eclipse IDE的Ardupilot飞控源码阅读环境搭建
- edge通常不会下载xxxx确保信任xxx怎么解决