水了两道有关字符串-写了篇题解

154 阅读2分钟

为了激励自己刷算法题,把水的两道题做成题解,方便共同学习。一道是求字符串最大匹配数值,一道是字符串有关的基础运用

题目一链接:超市货物架调整

image.png image.png

一眼字符串最大匹配数值

思路:

  1. 统计 s 中每个字符的出现次数
  2. 统计 c 中每个字符的出现次数
  3. 计算每个字符在 s 中可以匹配的最大次数,即 min(s_count[char], c_count[char])
  4. 累加所有字符的匹配次数

我们应该按照出现次数进行计算,以便最大化匹配的字符数。 AC代码:

from collections import defaultdict
# s和c进行匹配最大字符串长度
def solution(n: int, m: int, s: str, c: str) -> int:
    # 使用 defaultdict 统计 s 和 c 中每个字符的出现次数
    s_count = defaultdict(int)
    c_count = defaultdict(int)
    
    for char in s:
        s_count[char] += 1
    
    for char in c:
        c_count[char] += 1
    
    # 计算最多可以匹配的字符数
    max_match = 0
    for char in c_count:
        if char in s_count:
            max_match += min(s_count[char], c_count[char])
    
    return max_match

if __name__ == '__main__':
    print(solution(3, 4, "abc", "abcd") == 3)
    print(solution(4, 2, "abbc", "bb") == 2)
    print(solution(5, 4, "bcdea", "abcd") == 4)

题目二链接:数字字符串格式化

image.png

  1. 找到第一个不为0的字符
# 这部分代码通过循环找到第一个不为零的字符,并截取从该字符开始的部分。
    start = 0
    while start < len(s) and s[start] == '0':
        start += 1
    s = s[start:]
  1. 分割整数和小数部分
#  使用 `split('.')` 方法将字符串分割成整数部分和小数部分。
     parts = s.split('.')
     integer_part = parts[0]
     decimal_part = '.' + parts[1if len(parts) > 1 else ''

  1. 格式化整数部分
# 从整数部分的末尾开始,每隔三位插入一个逗号。
    n = len(integer_part)
    str_result = ''
    for i in range(n):
        if i > 0 and (n - i) % 3  == 0:
            str_result += ','
        str_result += integer_part [i]
  1. 拼接结果
# 将格式化后的整数部分和小数部分拼接起来。
   return str_result +  decimal_part

AC代码

def solution(s: str) -> str:
    start = 0
    while start < len(s) and s[start] == '0':
        start +=1
    s = s[start:]
    #   分隔
    parts = s.split('.')
    integer_part = parts[0] #整数
    decimal_part = '.' + parts[1] if len(parts) > 1 else ''

    n = len(integer_part)
    str_result = ''
    for i in range(n):
        if i > 0 and (n-i) % 3 == 0:
           str_result +=','
        str_result += integer_part[i]

    return str_result + decimal_part

if __name__ == '__main__':
    print(solution("1294512.12412") == '1,294,512.12412')
    print(solution("0000123456789.99") == '123,456,789.99')
    print(solution("987654321") == '987,654,321')`

有想要JS代码,看这:

function solution(s) {
    // 找到第一个不为0的字符
    let start = 0;
    while (s[start] === '0') {
        start++;
    }
    s = s.substring(start);

    // 分割整数和小数部分
    let parts = s.split('.');
    let integerPart = parts[0];
    let decimalPart = parts.length > 1 ? '.' + parts[1] : '';

    // 格式化整数部分
    let formattedIntegerPart = '';
    for (let i = 0; i < integerPart.length; i++) {
        if (i > 0 && (integerPart.length - i) % 3 === 0) {
            formattedIntegerPart += ',';
        }
        formattedIntegerPart += integerPart[i];
    }

    // 拼接结果
    return formattedIntegerPart + decimalPart;
}

function main() {
    console.log(solution("1294512.12412") === '1,294,512.12412');
    console.log(solution("0000123456789.99") === '123,456,789.99');
    console.log(solution("987654321") === '987,654,321');
}

main();

谢幕!