题解 | #字符串合并处理#

字符串合并处理

https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f

解题思路

  1. 第一步:字符串合并
    • 将两个输入字符串直接拼接
  2. 第二步:字符排序
    • 将字符串中的字符按奇偶位置分别排序
    • 奇数位置和偶数位置的字符分别从小到大排序
    • 排序后放回原位置
  3. 第三步:进制转换
    • 对于数字和字母进行二进制转换和翻转
    • 将翻转后的二进制转换为对应的数字或大写字母

代码

def merge_strings(str1, str2):
    """第一步:合并字符串"""
    return str1 + str2

def sort_by_position(s):
    """第二步:按奇偶位置排序"""
    # 分离奇数位和偶数位字符
    odd_chars = sorted([s[i] for i in range(len(s)) if i % 2 == 0])
    even_chars = sorted([s[i] for i in range(len(s)) if i % 2 == 1])
    
    # 重新组合字符串
    result = []
    odd_idx = 0
    even_idx = 0
    for i in range(len(s)):
        if i % 2 == 0:
            result.append(odd_chars[odd_idx])
            odd_idx += 1
        else:
            result.append(even_chars[even_idx])
            even_idx += 1
    return ''.join(result)

def convert_char(c):
    """转换字符
    1. 数字:直接转二进制
    2. 字母:先转为对应的十六进制值(a-f:10-15, A-F:10-15),再转二进制
    3. 翻转二进制,转回十六进制
    """
    if c > 'f' and c <= 'z' or c > 'F' and c <= 'Z':
        return c;
    if c.isdigit():
        binary = format(int(c), '04b')
    else:
        # 字母转为对应的十六进制值(0-15)
        val = int(c, 16) if c.lower() <= 'f' else ord(c.lower()) - ord('a')
        binary = format(val, '04b')
    
    # 翻转二进制并转为十六进制
    reversed_val = int(binary[::-1], 2)
    return format(reversed_val, 'X')

def process_string(str1, str2):
    # 第一步:合并字符串
    merged = str1 + str2
    
    # 第二步:奇偶位置分别排序
    odd_pos = sorted(merged[::2])
    even_pos = sorted(merged[1::2])
    
    # 重新组合
    result = ''
    i, j = 0, 0
    for k in range(len(merged)):
        if k % 2 == 0:
            result += odd_pos[i]
            i += 1
        else:
            result += even_pos[j]
            j += 1
    
    # 第三步:进制转换
    return ''.join(convert_char(c) for c in result)

while True:
    try:
        str1, str2 = input().split()
        print(process_string(str1, str2))
    except EOFError:
        break
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <bitset>
using namespace std;

string mergeStrings(const string& str1, const string& str2) {
    return str1 + str2;
}

string sortByPosition(const string& s) {
    vector<char> odd_chars, even_chars;
    for (int i = 0; i < s.length(); i++) {
        if (i % 2 == 0) odd_chars.push_back(s[i]);
        else even_chars.push_back(s[i]);
    }
    
    sort(odd_chars.begin(), odd_chars.end());
    sort(even_chars.begin(), even_chars.end());
    
    string result;
    int odd_idx = 0, even_idx = 0;
    for (int i = 0; i < s.length(); i++) {
        if (i % 2 == 0) result += odd_chars[odd_idx++];
        else result += even_chars[even_idx++];
    }
    return result;
}

char convertChar(char c) {
    if (c > 'f' && c <= 'z' || c > 'F' && c <= 'Z') {
        return c;
    }
    int val;
    if (isdigit(c)) {
        val = c - '0';
    } else {
        // 将字母转换为对应的十六进制值
        if (tolower(c) <= 'f') {
            string hex_str(1, c);
            val = stoi(hex_str, nullptr, 16);
        } else {
            val = tolower(c) - 'a';
        }
    }
    
    // 转为4位二进制并翻转
    string binary = bitset<4>(val).to_string();
    reverse(binary.begin(), binary.end());
    
    // 转回十六进制
    int reversed_val = bitset<4>(binary).to_ulong();
    if (reversed_val < 10) {
        return '0' + reversed_val;
    } else {
        return 'A' + (reversed_val - 10);
    }
}

string processString(const string& str1, const string& str2) {
    string merged = mergeStrings(str1, str2);
    string sorted = sortByPosition(merged);
    string result;
    for (char c : sorted) {
        result += convertChar(c);
    }
    return result;
}

int main() {
    string str1, str2;
    while (cin >> str1 >> str2) {
        cout << processString(str1, str2) << endl;
    }
    return 0;
}
import java.util.*;

public class Main {
    private static String mergeStrings(String str1, String str2) {
        return str1 + str2;
    }
    
    private static String sortByPosition(String s) {
        List<Character> oddChars = new ArrayList<>();
        List<Character> evenChars = new ArrayList<>();
        
        for (int i = 0; i < s.length(); i++) {
            if (i % 2 == 0) oddChars.add(s.charAt(i));
            else evenChars.add(s.charAt(i));
        }
        
        Collections.sort(oddChars);
        Collections.sort(evenChars);
        
        StringBuilder result = new StringBuilder();
        int oddIdx = 0, evenIdx = 0;
        for (int i = 0; i < s.length(); i++) {
            if (i % 2 == 0) result.append(oddChars.get(oddIdx++));
            else result.append(evenChars.get(evenIdx++));
        }
        return result.toString();
    }
    
    private static char convertChar(char c) {
        if (c > 'f' && c <= 'z' || c > 'F' && c <= 'Z') {
            return c;
        }
        int val;
        if (Character.isDigit(c)) {
            val = c - '0';
        } else {
            // 将字母转换为对应的十六进制值
            if (Character.toLowerCase(c) <= 'f') {
                val = Integer.parseInt(String.valueOf(c), 16);
            } else {
                val = Character.toLowerCase(c) - 'a';
            }
        }
        
        // 转为4位二进制并翻转
        String binary = String.format("%4s", Integer.toBinaryString(val)).replace(' ', '0');
        String reversed = new StringBuilder(binary).reverse().toString();
        
        // 转回十六进制
        int reversedVal = Integer.parseInt(reversed, 2);
        return reversedVal < 10 ? (char)('0' + reversedVal) : (char)('A' + (reversedVal - 10));
    }
    
    private static String processString(String str1, String str2) {
        String merged = mergeStrings(str1, str2);
        String sorted = sortByPosition(merged);
        StringBuilder result = new StringBuilder();
        for (char c : sorted.toCharArray()) {
            result.append(convertChar(c));
        }
        return result.toString();
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str1 = sc.next();
            String str2 = sc.next();
            System.out.println(processString(str1, str2));
        }
    }
}

算法及复杂度

  • 算法:字符串处理 + 排序 + 进制转换
  • 时间复杂度:,其中n为合并后字符串的长度,主要来自排序操作
  • 空间复杂度:,需要额外空间存储排序和转换过程中的字符
全部评论

相关推荐

上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
牛客51274894...:意思是光刷力扣还不够卷
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务