# 华为一个字符串处理的上机题 | 大染志
昨天下午参加了华为的上机笔试，3道题，但是答得不是很理想，回来有好好思考了一些，现在这里把相对较难的那道题分享一下。题目是这样的： 问题描述： 在给定字符串中找出单词（ “单词”由大写字母和小写字母字符构成，其他非字母字符视为单词的间隔，如空格、问号、数字等等；另外单个字母不算单词）；找到单词后，按照长度进行降序排序，（排序时如果长度相同，则按出现的顺序进行排列），然后输出到一个新的字符串中；如

大染志

Junv's blog

# 华为一个字符串处理的上机题

发表于 2012-09-16 更新于 2026-08-04

昨天下午参加了华为的上机笔试，3道题，但是答得不是很理想，回来有好好思考了一些，现在这里把相对较难的那道题分享一下。题目是这样的：

问题描述：

> 在给定字符串中找出单词（ “单词”由大写字母和小写字母字符构成，其他非字母字符视为单词的间隔，如空格、问号、数字等等；另外单个字母不算单词）；找到单词后，按照长度进行降序排序，（排序时如果长度相同，则按出现的顺序进行排列），然后输出到一个新的字符串中；如果某个单词重复出现多次，则只输出一次；如果整个输入的字符串中没有找到单词，请输出空串。输出的单词之间使用一个“空格”隔开，最后一个单词后不加空格。

> 要求实现函数：

> void my_word(charinput[], char output[])

> 【输入】 char input[], 输入的字符串

> 【输出】 char output[]，输出的字符串

> 【返回】 无

> 示例

> 输入：charinput[]=”some local buses, some1234123drivers” ，

> 输出：charoutput[]=”drivers local buses some”

> 输入：charinput[]=”%A^123 t 3453i*()” ，

> 输出：charoutput[]=””

乍一看，题目的确不怎么难，但是其中隐藏着很多细节。我的思考是这样的：

1. 首先分离其中的字符串（单词），需要注意的是单个字母不能成为单词，当到达字符串末尾时，即使没有符号，也需要分离单词。
2. 其次是排除其中的重复单词（java里使用 Set实现，set中不能出现重复的内容）
3. 对单词进行排序，按照单词长度逆序，如果单词的长度相同，则按照单词出现的先后顺序排序。在项目中我使用的是选择排序，时间复杂度略小于o(n*n)
4. 输出数据，如果没有单词输出””

下面贴出我实现的代码，如发现有什么问题，请指出：

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64

    package com.toozhao.test;

    import java.util.HashSet;
    import java.util.Set;

    /**
     * {@link} http://toozhao.com
     * @author Junv
     *
     */
    public class MyWord {

        /**
         * @param args
         */
        public static void main(String[] args) {
            MyWord test = new MyWord();
            System.out
                    .println(test.process("some local buses, some1234123drivers"));
        }

        /**
         * 将输入信息通过处理，使其满足要求。并返回
         *
         * @param input
         * @return
         */
        public String process(String input) {
            char[] array = input.toCharArray();

            Set list = new HashSet();
            int mark = 0;// 用于标记当前截断位置

            boolean formerIsChar = false; // 设置上一个是否是字符
            for (int i = 0; i  122
                        || (array[i] > 90 && array[i]
         * 使用的是选择排序
         * @param original
         * @return
         */
        public String[] sort(String[] original) {

            for (int i = 0; i  original[i].length()) {
                        temp = j;
                    }

                    // 如果长度相同，则看谁出现得早
                    if (original[j].length() == original[i].length()) {
                        if (j > i) {
                            temp = j;
                        }
                    }
                }

                if (temp != i) {
                    String tempStr = original[i];
                    original[i] = original[temp];
                    original[temp] = tempStr;
                }
            }
            return original;
        }

    }

0%