首页 > 编程语言 >【校招+社招】华为OD机试 - 拼接URL(Java、JavaScript、Python、C、C++)

【校招+社招】华为OD机试 - 拼接URL(Java、JavaScript、Python、C、C++)

时间:2024-07-22 12:28:13浏览次数:14  
标签:社招 Java URL self url host path port

鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

算法概述

URL拼接(URL拼接)是指将多个URL组件(方案、主机、端口、路径、查询参数等)组合成完整的URL字符串的过程。这在构建Web应用程序或进行网络请求时非常有用。

常见的URL拼接算法步骤如下:

  1. 构建基本URL:

    • 以所需的方案(如“https”或“http”)开头。
    • 添加“://”分隔符。
    • 添加主机名或IP地址。
    • 如果指定了端口,使用冒号(“:”)和端口号进行分隔。
    • 添加路径(通常以“/”开头)。
  2. 添加查询参数:

    • 如果存在查询参数,使用“?”符号开始查询参数部分。
    • 每个查询参数使用“&”符号分隔。
    • 每个参数使用“=”符号连接键和值。

代码实现

Java

public class UrlBuilder {

    private String scheme;
    private String host;
    private String port;
    private String path;
    private Map<String, String> queryParams;

    public UrlBuilder() {
        this.scheme = "https"; // Default to HTTPS
        this.port = null; // No default port
        this.path = "/"; // Default path to root
        this.queryParams = new HashMap<>();
    }

    public UrlBuilder setScheme(String scheme) {
        this.scheme = scheme;
        return this;
    }

    public UrlBuilder setHost(String host) {
        this.host = host;
        return this;
    }

    public UrlBuilder setPort(int port) {
        this.port = String.valueOf(port);
        return this;
    }

    public UrlBuilder setPath(String path) {
        this.path = path;
        return this;
    }

    public UrlBuilder addQueryParam(String key, String value) {
        this.queryParams.put(key, value);
        return this;
    }

    public String build() {
        StringBuilder urlBuilder = new StringBuilder();
        urlBuilder.append(scheme).append("://").append(host);

        if (port != null) {
            urlBuilder.append(":").append(port);
        }

        urlBuilder.append(path);

        if (!queryParams.isEmpty()) {
            urlBuilder.append("?");
            for (Map.Entry<String, String> entry : queryParams.entrySet()) {
                urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
            urlBuilder.deleteCharAt(urlBuilder.length() - 1); // Remove trailing '&'
        }

        return urlBuilder.toString();
    }

    public static void main(String[] args) {
        UrlBuilder builder = new UrlBuilder();
        String url = builder
                .setScheme("http")
                .setHost("www.example.com")
                .setPort(8080)
                .setPath("/api/users")
                .addQueryParam("id", "123")
                .addQueryParam("name", "John Doe")
                .build();

        System.out.println("Constructed URL: " + url);
    }
}

JavaScript

class UrlBuilder {
    constructor() {
        this.scheme = "https"; // Default to HTTPS
        this.host = null; // No default host
        this.port = null; // No default port
        this.path = "/"; // Default path to root
        this.queryParams = {};
    }

    setScheme(scheme) {
        this.scheme = scheme;
        return this;
    }

    setHost(host) {
        this.host = host;
        return this;
    }

    setPort(port) {
        this.port = port;
        return this;
    }

    setPath(path) {
        this.path = path;
        return this;
    }

    addQueryParam(key, value) {
        this.queryParams[key] = value;
        return this;
    }

    build() {
        let url = `${this.scheme}://${this.host}`;

        if (this.port) {
            url += `:${this.port}`;
        }

        url += this.path;

        if (Object.keys(this.queryParams).length > 0) {
            url += "?";
            for (const [key, value] of Object.entries(this.queryParams)) {
                url += `${key}=${encodeURIComponent(value)}&`;
            }
            url = url.slice(0, -1); // Remove trailing '&'
        }

        return url;
    }

    static create() {
        return new UrlBuilder();
    }
}

// Usage example
const urlBuilder = UrlBuilder.create()
    .setScheme("http")
    .setHost("www.example.com")
    .setPort(8080)
    .setPath("/api/users")
    .addQueryParam("id", 123)
    .addQueryParam("name", "John Doe");

const constructedUrl = urlBuilder.build();
console.log("Constructed URL:", constructedUrl);

拼接URL(Python、C、C++)完整实现及部署测试搭建(中文解释)

Python实现

Python

import urllib.parse

class UrlBuilder:
    def __init__(self):
        self.scheme = "https"
        self.host = None
        self.port = None
        self.path = "/"
        self.queryParams = {}

    def set_scheme(self, scheme):
        self.scheme = scheme
        return self

    def set_host(self, host):
        self.host = host
        return self

    def set_port(self, port):
        self.port = port
        return self

    def set_path(self, path):
        self.path = path
        return self

    def add_query_param(self, key, value):
        self.queryParams[key] = value
        return self

    def build(self):
        url_components = []
        url_components.append(self.scheme)
        url_components.append("://")
        url_components.append(self.host)

        if self.port:
            url_components.append(":")
            url_components.append(str(self.port))

        url_components.append(self.path)

        if self.queryParams:
            query_params = []
            for key, value in self.queryParams.items():
                query_params.append(f"{key}={urllib.parse.quote(value)}")
            query_string = "?" + "&".join(query_params)
            url_components.append(query_string)

        return "".join(url_components)

# Usage example
url_builder = UrlBuilder()
url = url_builder \
    .set_scheme("http") \
    .set_host("www.example.com") \
    .set_port(8080) \
    .set_path("/api/users") \
    .add_query_param("id", 123) \
    .add_query_param("name", "John Doe") \
    .build()

print("Constructed URL:", url)

解释:

  1. UrlBuilder类:

    • 定义用于构建URL的类。
    • 包含schemehostportpathqueryParams属性,用于存储URL的各个组成部分。
    • 提供set_schemeset_hostset_portset_pathadd_query_param方法,用于设置URL的各个组成部分。
    • 提供build方法,用于构建完整的URL字符串。
  2. build方法:

    • 将URL的各个组成部分拼接成完整的URL字符串。
    • 使用urllib.parse.quote函数对查询参数值进行编码,确保URL格式正确。
  3. 使用示例:

    • 创建一个UrlBuilder实例。
    • 使用set_schemeset_hostset_portset_pathadd_query_param方法设置URL的各个组成部分。
    • 使用build方法构建完整的URL字符串。
    • 打印构建的URL字符串。

运行代码:

  1. 保存代码:

    • 将Python代码保存为url_builder.py文件。
  2. 运行代码:

    • 打开终端或命令提示符,并导航到保存代码的目录。
    • 运行以下命令:

python url_builder.py

这将打印构建的URL字符串。

C实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *url_builder(char *scheme, char *host, int port, char *path, char **query_params, int num_query_params) {
    char *url = NULL;
    int url_len = 0;

    // Calculate URL length
    url_len += strlen(scheme) + 3; // "://"
    url_len += strlen(host);
    if (port > 0) {
        url_len += strlen(":") + 10; // Assuming port is a maximum of 10 digits
    }
    url_len += strlen(path);
    if (num_query_params > 0) {
        url_len += strlen("?") + 1; // Assuming each query parameter is a maximum of 100 characters
        for (int i = 0; i < num_query_params; i++) {
            url_len += strlen(query_params[i]) + 1; // Assuming each query parameter value is a maximum of 100 characters and separated by '&'
        }
    }

    // Allocate memory for the URL
    url = malloc(url_len + 1);
    if (!url) {
        return NULL;
    }

    // Construct the URL
    char *url_ptr = url;
    strcpy(url_ptr, scheme);
    url_ptr += strlen(scheme);
    strcpy(url_ptr, "://");
    url_ptr += 3;
    strcpy(url_ptr, host);
    url_ptr += strlen(host);

    if (port > 0) {
        strcpy(url_ptr, ":");
        url_ptr++;
        sprintf(url_ptr, "%d", port);
        url_ptr += strlen(url_ptr);
    }

    strcpy(url_ptr, path);
    url_ptr += strlen(path);

    if (num_query_params > 0) {
        strcpy(url_ptr, "?");
        url_ptr++;
        for (int i = 0; i < num_query_params; i++) {
            strcpy(url_ptr, query_params[i]);
            url_ptr += strlen(query_params[i]);
            if (i < num_query_params - 1) {
                strcpy(url_ptr, "&");
                url_ptr++;
            }
        }
    }

    url_ptr[0] = '\0'; // Null-terminate the URL string

    return url;
}

// Usage example
char *query_params[] = {
    "id=123",
    "name=John%20Doe"
};
char *url = url_builder("https", "www.example.com", 8080, "/api/users", query_params, 2);
printf("Constructed URL: %s\n", url);
free(url);

C++实现

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <cstdlib>

using namespace std;

string urlBuilder(string scheme, string host, int port, string path, vector<pair<string, string>> queryParams) {
    stringstream url;

    url << scheme << "://";
    url << host;

    if (port > 0) {
        url << ":" << port;
    }

    url << path;

    if (!queryParams.empty()) {
        url << "?";
        for (const auto& param : queryParams) {
            url << param.first << "=" << param.second << "&";
        }
        url.seekp(-1, ios::end); // Remove trailing '&'
    }

    return url.str();
}

int main() {
    vector<pair<string, string>> queryParams = {
        {"id", "123"},
        {"name", "John Doe"}
    };

    string url = urlBuilder("https", "www.example.com", 8080, "/api/users", queryParams);
    cout << "Constructed URL: " << url << endl;

    return 0;
}

代码解释

1. urlBuilder 函数:

  • 该函数用于构建完整的URL字符串。
  • 它接收以下参数:
    • scheme: URL 的方案,例如 "https" 或 "http"。
    • host: URL 的主机名或IP地址。
    • port: URL 的端口号(可选)。
    • path: URL 的路径。
    • queryParams: 一个包含查询参数键值对的vector。
  • 函数使用 stringstream 对象来构建URL字符串。
  • 它将scheme、host、port和path组件依次添加到stringstream中。
  • 如果提供了查询参数,它会遍历vector并添加每个键值对,并用 '&' 字符分隔。
  • 最后,它使用 seekp 方法删除多余的 '&' 字符并返回构建的URL字符串。

2. main 函数:

  • 该函数用于演示 urlBuilder 函数的使用。
  • 它创建一个包含查询参数键值对的vector。
  • 它调用 urlBuilder 函数并传入参数来构建URL字符串。
  • 最后,它打印构建的URL字符串。

部署和测试

1. 编译代码:

  • 您需要使用 C++ 编译器来编译代码。
  • 具体步骤取决于您使用的编译器和操作系统。
  • 一般来说,您可以使用以下命令进行编译:
g++ url_builder.cpp -o url_builder

2. 运行代码:

  • 您可以使用以下命令运行编译后的可执行文件:
./url_builder

3. 测试代码:

  • 您可以检查输出的URL字符串是否与预期一致。
  • 您还可以尝试修改输入参数并观察输出如何变化。

注意:

  • 您需要确保您的计算机上安装了 C++ 编译器和运行时环境。
  • 您还可以使用其他 C++ 开发环境或 IDE 来编译和运行代码。

示例输出:

Constructed URL: https://www.example.com:8080/api/users?id=123&name=John%20Doe

标签:社招,Java,URL,self,url,host,path,port
From: https://blog.csdn.net/feng1790291543/article/details/140087084

相关文章

  • Java常见的超时及设计
    在Java编程中,处理超时通常涉及到几种不同的场景,包括网络请求超时、线程执行超时、数据库操作超时等。合理设计超时机制可以提高程序的健壮性和用户体验。以下是一些常见超时设计的方法:1.网络请求超时对于HTTP请求或任何网络IO操作,可以使用URLConnection、HttpURLConnection、Ok......
  • 现代Web开发的JavaScript核心概念
    在当今的Web开发中,JavaScript不仅是一种优势,更是必不可少的工具。它不断带来新功能、新术语和新概念,使Web应用程序更加互动、高效和用户友好。无论你是刚刚踏上Web开发之路,还是想提升自己的技能,掌握JavaScript的基本术语都是至关重要的。在这篇综合指南中,我们将探讨每......
  • Java中的代码比较工具
    大家好,我是城南。在如今的编程世界里,代码比较工具已经成为开发者不可或缺的一部分。不论是代码审查、版本控制,还是调试,代码比较工具都能帮助我们高效地进行工作。今天我们就来深入探讨一下Java中的代码比较工具,从它们的功能、特点到使用技巧,全方位了解这些工具如何提升我们......
  • Java中的代码分析工具
    大家好,我是城南。在现代软件开发过程中,代码质量和安全性已经成为不容忽视的关键问题。特别是对于Java开发者来说,代码分析工具不仅能够帮助我们提升代码质量,还能在早期阶段发现潜在的漏洞和问题。那么,今天我们就来深入探讨几款在Java开发中广受欢迎的代码分析工具,看看它们如......
  • Java中的代码格式化管理
    大家好,我是城南。在Java开发中,代码格式化是一项至关重要的技能,不仅能提升代码的可读性,还能在团队协作中保持代码的一致性。今天,我们就来深入探讨Java中的代码格式化管理,让你的代码更加优雅、整洁。什么是代码格式化?代码格式化就是按照一定的规则对代码进行排版和整理,使其......
  • Java中的代码修复管理
    大家好,我是城南。在软件开发的世界里,代码修复管理是一个极为重要但又常常被忽视的环节。今天我们就来深入探讨一下Java中的代码修复管理。无论你是刚入门的新手还是经验丰富的老手,掌握这一技能都会让你在开发过程中如虎添翼。代码修复管理的意义在软件开发生命周期中,代......
  • 【前端】JavaScript入门及实战71-75
    文章目录71数组72数组的方法73数组的遍历74数组练习75forEach71数组<!DOCTYPEhtml><html><head><title></title><metacharset="utf-8"><scripttype="text/javascript"> //使用字面量来创建数组 //语法:[] vararr=[......
  • Java性能优化-String的intern()方法的使用减少内存消耗
    场景String.intern()String.intern()方法用于在字符串常量池中查找是否存在与指定字符串相等的字符串。如果找到了,就返回该字符串的引用;否则,就在字符串常量池中创建一个新的字符串对象,并返回对它的引用。这个方法对于避免创建重复的字符串对象非常有用,特别是在处理大量字符串......
  • Java基础面试题大全 -001
    1、Java语言有哪些特点1、简单易学、有丰富的类库2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高)3、与平台无关性(JVM是Java跨平台使用的根本)4、可靠安全5、支持多线程6、java生态完善2、面向对象和面向过程的区别面向过程:是分析解决问题的步骤,然后用函数......
  • JAVA:正则表达式匹配
    1.非捕获组(?:)/***根据正则表达式找到字符串中符合条件的字符段,并输出到控制台*/publicstaticvoidmatch(Stringregex,Stringstr){Patternpattern=Pattern.compile(regex);Matchermatcher=pattern.matcher(str);while(matcher.find()){Syste......