URL编码(LintCode刷题)

举报
兰舟千帆 发表于 2022/07/14 23:27:39 2022/07/14
【摘要】 原题目如下 给出一个代表网址 host 的字符串 base_url,和代表查询参数的数组 query_params,你需要返回带查询参数的完整 URL。 查询参数由一些包含两个元素的数组组成,第一个元素代...

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


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


样例 1:

输入:

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

  
 
  • 1
  • 2

输出:

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

  
 
  • 1

样例 2:

输入:

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

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

  
 
  • 1

解释:
参数需要按照字典序拼接,所以需要先拼接 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();
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

说明。该种方法采用了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);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

该解法主要关键点

//调用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));
            }
        });

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

文章来源: daodaozi.blog.csdn.net,作者:兰舟千帆,版权归原作者所有,如需转载,请联系作者。

原文链接:daodaozi.blog.csdn.net/article/details/122805738

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。