URL编码(LintCode刷题)

简介: 原题目如下给出一个代表网址 host 的字符串 base_url,和代表查询参数的数组 query_params,你需要返回带查询参数的完整 URL。查询参数由一些包含两个元素的数组组成,第一个元素代表参数,第二个元素代表该参数对应的值。现在需要你拼接两个部分得到完整的 URL。base_url 和查询参数字符串之间使用 ? 拼接,在查询参数的参数和值之间通过 = 拼接,各个查询参数之间使用 & 拼接。查询参数需要根据字典序排序。

原题目如下


给出一个代表网址 host 的字符串 base_url,和代表查询参数的数组 query_params,你需要返回带查询参数的完整 URL。


查询参数由一些包含两个元素的数组组成,第一个元素代表参数,第二个元素代表该参数对应的值。


现在需要你拼接两个部分得到完整的 URL。base_url 和查询参数字符串之间使用 ? 拼接,在查询参数的参数和值之间通过 = 拼接,各个查询参数之间使用 & 拼接。查询参数需要根据字典序排序。


代表查询参数的数组 query_params 长度在 100100 以内。数据中不会包含特殊的需要转义的字符。


样例 1:


输入:


"https://www.lintcode.com/problem"
[["typeId","2"]]


输出:


"https://www.lintcode.com/problem?typeId=2"


样例 2:


输入:


"https://translate.google.cn/"
[["sl","en"],["tl","zh-CN"],["text","Hello"],["op","translate


"https://translate.google.cn/?op=translate&sl=en&text=Hello&tl=zh-CN"


解释:


参数需要按照字典序拼接,所以需要先拼接 op 部分,然后是 sl 部分,接着是 text 部分,最后才是 tl 部分。


题目梳理


1:一个host字符串base_url

2:代表查询的参数的数组query_params

3:查询参数的组成包含两个参数,一个元素代表参数,第二个对应参数的值

4:查询参数是存放于数组中的数组(由样例可以看出)

5:拼接要求:base_url与后面的查询参数连接,中间连接符为?号,查询参数的参数和其对应的值用=连接。

6:多个查询参数按照&连接

7:查询参数根据字典序排序

8:注意点:需要考虑查询参数为空的情况


题解方法一:


import java.util.*;
public class Solution {
    /**
     * @param base_url: the string of base_url
     * @param query_params: sequence of two-element tuples by query_params
     * @return: return a url query string
     */
    public String urlencode(String base_url, List<List<String>> query_params) {
        // write your code.
        StringBuilder sb = new StringBuilder();
        sb.append(base_url);//将base_url添加进来
        if(query_params.size() != 0){ //查询参数没有的时候,是不需要添加问号的
            sb.append("?");
        }
        int count = 0;
        TreeMap<String,String> map = new TreeMap<>(); //使用到了TreeMap双列集合
        for (int i = 0;i<query_params.size();i++){
            map.put(query_params.get(i).get(0),query_params.get(i).get(1));//相当于获取对应的键值对,并添加进去
        }
        for(Object o:map.keySet()){
            ++ count;
            String temp = o + "=" + map.get(o);
            sb.append(temp);
            if(count < query_params.size()){
                sb.append("&");
            }
        }
        System.out.println(sb.toString());
        return sb.toString();
    }
}


说明。该种方法采用了StringBuilder先去添加基本的host字符串。然后在Map集合中处理后续的查询参数。通过遍历查询参数进行将键值分别添加到map集合。然后处理查询参数和值之间进行=号连接,以及后续各个查询参数进行&号连接。处理好直接的关系。

题解二(官方题解)


public class Solution {
    /**
     * @param base_url: the string of base_url
     * @param query_params: sequence of two-element tuples by query_params
     * @return: return a url query string
     */
    public String urlencode(String base_url, List<List<String>> query_params) {
        if (query_params == null || query_params.size() == 0) {
            return base_url;
        }
        Collections.sort(query_params, new Comparator<List<String>>() {
            @Override
            public int compare(List<String> o1, List<String> o2) {
                return o1.get(0).compareTo(o2.get(0));
            }
        });
        StringBuffer sb = new StringBuffer(base_url + "?");
        for (int i = 0; i < query_params.size(); i++) {
            String key = query_params.get(i).get(0);
            String val = query_params.get(i).get(1);
            sb.append(key + "=" + val);
            if (i != query_params.size() - 1) {
                sb.append("&");
            }
        }
        return String.valueOf(sb);
    }
}


该解法主要关键点


//调用Collection.sort()方法。并重写了compare方法
   Collections.sort(query_params, new Comparator<List<String>>() {
            @Override
            //重写了compare方法
            public int compare(List<String> o1, List<String> o2) {
                return o1.get(0).compareTo(o2.get(0));
            }
        });



相关文章
|
3天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
17 4
|
3月前
|
JavaScript 前端开发 数据格式
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
URL编码【详解】——Javascript对URL进行编码解码的三种方式的区别和使用场景,axios请求拦截器中对get请求的参数全部进行URL编码
181 0
|
4月前
|
安全 JavaScript PHP
URL百分号编码
URL百分号编码
|
5月前
|
Java
dk1.8和jdk17底层对url参数的编码不一样吗
dk1.8和jdk17底层对url参数的编码不一样吗
88 0
|
5月前
|
JavaScript
URL编码中的escape、encodeURI和encodeURIComponent
URL编码中的escape、encodeURI和encodeURIComponent
155 1
|
5月前
|
数据安全/隐私保护
URL编码解析方式-特殊字符加密和解密
URL编码解析方式-特殊字符加密和解密
97 0
|
5月前
|
Python
Python-URL编码和URL解码方法
Python-URL编码和URL解码方法
112 0
|
11月前
|
JavaScript 前端开发
JS实现url的编码和解码
JS实现url的编码和解码
103 1
|
5月前
|
存储 Web App开发 JavaScript
Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码
Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码
682 0
|
11月前
a标签下载特殊字符url手动编码浏览器兼容性不显示
a标签下载特殊字符url手动编码浏览器兼容性不显示