「Java编程题」 字符串碎片

这篇博客记录了一道网易笔试题的解决方案,涉及字符串处理。博主分享了自己解决字符串碎片问题的思路,虽然不是最优方法,但旨在帮助学习者理解和开拓思维。题目要求计算由同一字母组成的最大连续子串(碎片)的平均长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人闲来无事去做了网易的笔试题, 竟然做了好长时间才做出来>_<  太丢人了

之后去百度答案也没有找到一个通俗易懂的方法, 特在此记录一下我的思路及方法, 以便后来的学习者们学习以及开拓思维.

(此方法并非最优方法, 大佬勿喷, 仅仅是一种思路, 若有更好方法欢迎评论! )


题目:

一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。

输入描述:
输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s只含小写字母('a'-'z')


输出描述:
输出一个整数,表示所有碎片的平均长度,四舍五入保留两位小数。

如样例所示: s = "aaabbaaac"
所有碎片的平均长度 = (3 + 2 + 3 + 1) / 4 = 2.25

输入例子1:
aaabbaaac

输出例子1:
2.25


代码如下:

import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class 字符串碎片 {
    public static void main(String[] args) {
        String input = new Scanner(System.in).next();
        //nums用于存储各个数量的集合
        List<Integer> nums = new LinkedList<>();

        //用作下标号指针
        int index = 0;

        while (index < input.length()) {
            //用于存储长度
            int length = 1;
            //若指针所指数字和指针下一个数字相同, 长度+1
            while (index < input.length() - 1 && isEquals(input.charAt(index), input.charAt(index + 1))) {
                length++;
                index++;
            }
            nums.add(length);
            index++;
        }
        //System.out.println("nums:"+nums);

        double sum = 0;
        for (int num : nums) {
            sum += num;
        }
        //DecimalFormat dFormat = new DecimalFormat("#.00");
        //Double temp = Double.valueOf(dFormat.format(sum / nums.size()));


        DecimalFormat df = new DecimalFormat("0.00");
        String result = df.format(sum / nums.size());

        System.out.println(result);


    }

    public static boolean isEquals(char str1, char str2) {
        if (String.valueOf(str1).equals(String.valueOf(str2))) return true;
        return false;
    }
}

<think>嗯,用户这次想了解Linux环境下将字符串转换为大写的具体方法。之前提供的系统级指令要求所有数学表达式用LaTeX格式,但这次问题属于命令行操作范畴,不需要数学公式,重点在于给出准确的终端命令示。从用户引用的材料来看,ta可能遇到了大小写转换的实际需求:1.引用[1]提到C语言字符串大小写转换的开发困境,用户可能正在编写类似strtok功能的程序2.引用[2]直接关联tr命令的字符转换功能,这是最相关的解决方案3.引用[3]的Java表明用户可能有跨语言对比的潜意识需求考虑到用户是Linux环境,应该优先推荐原生命令而非编程方案。tr命令显然是最佳选择:-通过管道配合echo使用简单直观(如echo"hello"|tr'a-z''A-Z')-支持文件批量处理(如tr'[:lower:]''[:upper:]'< input.txt)-符合Unix哲学的小而专理念用户特意提到"命令或方法",可能暗示期待多种实现方案备选。因此除了tr核心方案外,还需要准备:1.bash内置参数扩展(${var^^}这种纯shell方案)2.awk的toupper函数(适合复杂文本处理)3.dd命令的冷门用法(虽然小众但能体现知识广度)注意到历史对话里用户对优化方法感兴趣(参考之前quick_sort的问答模式),这里可以在补充方案里提性能对比:-tr是编译型二进制,处理GB级数据更快-bash方案零进程开销,适合短字符串-awk适合带格式的文本最后要规避三个引用材料里的潜在干扰:-忽略C语言方案(除非用户后续追问)-不展开Java实现(引用[3]明显是面试题碎片)-跳过strtok话题(虽然引用[1]提及但与本问题无关)在安全方面注意:-所有命令示避免使用rm等危险操作-标注dd命令需要谨慎使用-文件处理强调输入输出隔离</think> 在Linux环境下将字符串转换为大写有**多种高效方法**,结合您的需求和系统特性,推荐以下方案(附详细示): --- ### 一、核心命令推荐:`tr`(字符转换工具) **语法**: ```bash echo "原字符串" | tr '[:lower:]' '[:upper:]' # 或简写为 echo "原字符串" | tr 'a-z' 'A-Z' ``` **实操示**: ```bash $ echo "hello world" | tr 'a-z' 'A-Z' HELLO WORLD # 输出大写结果 # 直接处理变量(适用于脚本) $ str="cat a.c" $ echo ${str} | tr 'a-z' 'A-Z' CAT A.C ``` > 📌 **优势**: > 1. Linux原生支持,无需额外安装 > 2. 支持管道操作,可批量处理文件(如`cat file.txt | tr 'a-z' 'A-Z'`)[^2] > 3. 字符集`[:lower:]`/`[:upper:]`兼容多语言字符 --- ### 二、备选方案(根据场景选用) #### 1. Bash内置参数扩展(纯Shell方案) ```bash $ str="linux command" $ echo ${str^^} # 双尖帽语法(Bash 4.0+) LINUX COMMAND ``` #### 2. `awk`命令(复杂文本处理) ```bash $ echo "text" | awk '{print toupper($0)}' TEXT ``` #### 3. `dd`命令(冷门但高效) ```bash $ echo "abc" | dd conv=ucase 2>/dev/null ABC ``` --- ### ⚠️ 避坑指南 - **避免编程语言依赖**: 如引用[3]的Java方案或C语言函数(需编译执行),在简单转换场景效率过低[^1][^3] - **字符集兼容性**: 非英语字符(如法语é)推荐使用`tr '[:lower:]' '[:upper:]'`确保正确转换 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值