当前位置: 首页 > article >正文

华为OD机试 - 字符串分割(二) - 双指针(Python/JS/C/C++ 2024 C卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

一、题目描述

给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。

对于新组成的每一个子串,

  • 如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;
  • 反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;
  • 大小写字母的数量相等时,不做转换。

二、输入描述

输入为两行,第一行为参数K,第二行为字符串S。

三、输出描述

输出转换后的字符串。

四、测试用例

测试用例1

1、输入

3
12abc-abcABC-4aB@

2、输出

12abc-abc-ABC-4aB-@

3、说明

子串为12abc、abCABc、4aB@,第一个子串保留,
后面的子串每3个字符一组为abC、ABc、4aB、@,
abC中小写字母较多,转换为abc,
ABc中大写字母较多,转换为ABC,
4aB中大小写字母都为1个,不做转换,
@中没有字母,连起来即12abc-abc-ABC-4aB-@

测试用例2

1、输入

3
Test-aaBBcc-CCddEE

2、输出

Test-aab-bcc-CCD-DEE

3、说明

五、解题思路

题目很简单:

  1. 输入一行字符串,以-分隔
  2. 分隔的第一个字符串直接拼接,其余的字符串,每k个字符拼接一次,以-分隔
  3. 每k个字符截取一次,通过双指针截取即可,right - left = 3

六、Python算法源码

def convert_case(s: str) -> str:
    # 统计大小写字母数量
    lower_count = sum(1 for c in s if c.islower())
    upper_count = sum(1 for c in s if c.isupper())
    
    # 根据数量关系进行转换
    if lower_count > upper_count:
        return s.lower()
    elif upper_count > lower_count:
        return s.upper()
    return s

def process_string(k: int, s: str) -> str:
    # 输入验证
    if not s or k <= 0:
        return s
    
    # 分割字符串
    parts = s.split('-')
    if len(parts) <= 1:
        return s
    
    # 处理第一部分
    result = [parts[0]]
    remaining = ''.join(parts[1:])
    
    # 按K个字符分组处理
    for i in range(0, len(remaining), k):
        group = remaining[i:i+k]
        result.append(convert_case(group))
    
    return '-'.join(result)

七、JavaScript算法源码

function convertCase(str) {
    // 统计大小写字母数量
    const lowerCount = (str.match(/[a-z]/g) || []).length;
    const upperCount = (str.match(/[A-Z]/g) || []).length;
    
    // 根据数量关系转换
    if (lowerCount > upperCount) {
        return str.toLowerCase();
    } else if (upperCount > lowerCount) {
        return str.toUpperCase();
    }
    return str;
}

function processString(k, s) {
    // 输入验证
    if (!s || k <= 0) return s;
    
    // 分割字符串
    const parts = s.split('-');
    if (parts.length <= 1) return s;
    
    // 处理第一部分
    const result = [parts[0]];
    const remaining = parts.slice(1).join('');
    
    // 按K个字符分组处理
    for (let i = 0; i < remaining.length; i += k) {
        const group = remaining.slice(i, i + k);
        result.push(convertCase(group));
    }
    
    return result.join('-');
}

八、C算法源码

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

void convertCase(char* str) {
    int lowerCount = 0, upperCount = 0;
    int len = strlen(str);
    
    // 统计大小写字母数量
    for (int i = 0; i < len; i++) {
        if (islower(str[i])) lowerCount++;
        else if (isupper(str[i])) upperCount++;
    }
    
    // 根据数量关系转换
    if (lowerCount > upperCount) {
        for (int i = 0; i < len; i++) {
            str[i] = tolower(str[i]);
        }
    } else if (upperCount > lowerCount) {
        for (int i = 0; i < len; i++) {
            str[i] = toupper(str[i]);
        }
    }
}

void processString(int k, char* s) {
    if (!s || k <= 0) return;
    
    char result[1000] = {0};
    char* token = strtok(s, "-");
    
    // 处理第一部分
    strcpy(result, token);
    strcat(result, "-");
    
    // 合并剩余部分
    char remaining[1000] = {0};
    while ((token = strtok(NULL, "-"))) {
        strcat(remaining, token);
    }
    
    // 按K个字符分组处理
    int len = strlen(remaining);
    char group[1000];
    for (int i = 0; i < len; i += k) {
        strncpy(group, remaining + i, k);
        group[k] = '\0';
        convertCase(group);
        strcat(result, group);
        if (i + k < len) strcat(result, "-");
    }
    
    strcpy(s, result);
}

九、C++算法源码

class Solution {
public:
    static string processString(int k, string s) {
        if (s.empty() || k <= 0) return s;
        
        // 分割字符串
        vector<string> parts;
        stringstream ss(s);
        string part;
        while (getline(ss, part, '-')) {
            parts.push_back(part);
        }
        
        if (parts.size() <= 1) return s;
        
        // 处理第一部分
        string result = parts[0];
        string remaining;
        for (size_t i = 1; i < parts.size(); i++) {
            remaining += parts[i];
        }
        
        // 按K个字符分组处理
        for (size_t i = 0; i < remaining.length(); i += k) {
            result += "-";
            string group = remaining.substr(i, k);
            result += convertCase(group);
        }
        
        return result;
    }
    
private:
    static string convertCase(const string& str) {
        int lowerCount = 0, upperCount = 0;
        
        // 统计大小写字母数量
        for (char c : str) {
            if (islower(c)) lowerCount++;
            else if (isupper(c)) upperCount++;
        }
        
        string result = str;
        // 根据数量关系转换
        if (lowerCount > upperCount) {
            transform(result.begin(), result.end(), result.begin(), ::tolower);
        } else if (upperCount > lowerCount) {
            transform(result.begin(), result.end(), result.begin(), ::toupper);
        }
        
        return result;
    }
};

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

在这里插入图片描述


http://www.kler.cn/a/378488.html

相关文章:

  • RHCSA课后练习3(网络与磁盘)
  • 气象大模型学习笔记
  • 操作系统(10) (并发(2)------基于软件/硬件/操作系统层面解决两个进程之间的临界区问题/抢占式/非抢占式内核)
  • Llama 3.2 Vision Molmo:多模态开源生态系统基础
  • go 包管理
  • ABeam 德硕 | 共探AI时代人才新生态,ABeam旗下德硕管理咨询(上海)有限公司荣膺2024杰出雇主!
  • [ vulnhub靶机通关篇 ] 渗透测试综合靶场 Corrosion1 通关详解 (附靶机搭建教程)
  • 基于Spring Boot + Vue的气象智慧监测系统设计与实现
  • python读word中的表格和插入表格
  • 电子电气架构 --- Trace 32(劳特巴赫)多核系统的调试
  • Freertos学习日志(1)-基础知识
  • 11.1组会汇报-基于区块链的安全多方计算研究现状与展望
  • 【原创分享】详述中间件的前世今生
  • .Net Framework里演示怎么样使用StringBuilder、Math.Min和String.Format
  • c# 实现文件更新通知
  • JavaEE-多线程初阶(1)
  • MySQL-基础汇总
  • 知识见闻 - Workday公司介绍
  • springboot 基于google 缓存,实现防重复提交
  • 掌握ElasticSearch(六):分析过程
  • linux当中用到的系统调用和库函数
  • elementUI tabs 吸顶功能实现,拉到最底部时候点击tab 回到最初位置
  • 【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台
  • C++/list
  • 模型 康威定律(沟通VS技术架构)
  • 【Redis实践】使用zset实现实时排行榜以及一些优化思考