【华为机考】模拟题:Words、Vowel、计算字符串重新排列数

news2024/11/16 7:35:20

前言

刷题之路任重而道远,革命尚未成功,同志仍需努力。由于刷惯了 LeetCode,虽然知道华为机考是需要自己输入输出,也稍稍练了一下,结果真做模拟题的时候,一下子忘了怎么获取字符串了,直接搞了个 BufferReader.readLine() 来读取字符串,麻烦的雅痞,还需要自己手动抛出异常,记录之,以下模拟题均为真实模拟题,内容来源于网络,参考链接见最后。

Scanner 输入模板
更多内容可参考:Scanner类& 键盘中循环输入多行数组的方法

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 获取字符串
        String str1 = sc.next();  // 不得输入带有空格的字符串
        String str2 = sc.nextLine();  // 输入之间可以有空白,回车是结束标识符
        // 获取整型数据
        int n = sc.nextInt();
        // 获取浮点型数据
        float f = sc.nextFloat();
        Double d = sc.nextDouble();
        // hasNextXxx:用来判断输入的数据是否满足要求
        // 例如:
        while (sc.hasNextInt()){  // 此处就是通过hasNextInt方法判断输入的流是否是int类型
            int a = sc.nextInt();
            int b = sc.nextInt();
        }
        sc.close();  // 用完关掉(IO流如果不关掉就会一直占用资源)
    }
}

一、Words (100分)

1、题目描述

每个句子由多个单词组成,句子中的每个单词的长度都可能不一样,假设每个单词的长度 Ni 为该单词的重量,你需要做的就是给出整个句子的平均重量 V

输入
输入只有一行,包含一个字符串S(长度不会超过100),代表整个句子,句子中只包含大小写的英文字母,每个单词之间有一个空格。

输出
输出句子 S 的平均重量 V(四舍五入保留两位小数)

2、测试用例

输入: Who Love Solo
输出 :3.67

3、题解

该题是个简单题,整体思路也很清晰。由题意得,题目要求求出句子的平均重量 V,那么题目中也说了 每个单词的长度就是该单词的重量,再根据输入输出,我们很容易就知道 (平均重量V = 句子中所有单词的重量和 / 单词的个数)。

此外,本题在CodeFun2000(2022.10.9-句子的平均重量)中有相关测试用例,可以进行在线测试。

3.1 一次遍历 – O(n) (⭐)

时间复杂度 O(n),空间复杂度 O(n)

只要理解题意,题目就很简单,根据上面的分析,我们知道了(平均重量V = 句子中所有单词的重量和 / 单词的个数),且输入用例只有一行字符串,那么我们就直接把这行字符串存储下来,获得它的长度 len ,然后遍历这个字符串,找出字符串中空格的个数,因为每个单词之间有一个空格,那么就说明一般情况下,字符串中总的单词个数应该为 空格数+1,那么根据这个关系我们就能很容易的写出计算公式:1.0 *(len - space) / (space + 1)

Note:以上分析是介于输入正确的情况下,如果输入中包含一些特殊字符,需要额外进行处理。例如:如果输入的字符串中首尾都带有空格,那么此时我们就需要使用 trim() 方法来去除字符串中的首尾空格。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();  // 获取字符串
        int len = str.length();  // 获取字符串长度
        int space = 0;  // 记录空格个数
        for (int i = 0; i < len; i++) {  // 遍历字符串
            if (str.charAt(i) == ' ')  // 注意charAt返回的是一个字符
                space++;
        } 
        System.out.printf("%.2f", 1.0 *(len - space) / (space + 1));
    }
}

在这里插入图片描述

二、Vowel(100分)

1、题目描述

solo 从小就对英文字母非常感兴趣,尤其是元音字母(a,e,i,o,u,A,E,I,O,U),他在写日记的时候都会把元音字母写成大写的,辅音字母则都写成小写,虽然别人看起来很别扭,但是 solo 却非常熟练。你试试把一个句子翻译成 solo 写日记的习惯吧。

输入
输入一个字符串S(长度不会超过100,只包含大小写的英文字母和空格)。

输出
按照 solo 写日记的习惯输出翻译后的字符串 S 。

2、测试用例

输入: Who Love Solo
输出 :whO lOvE sOlO

3、题解

题目非常清晰,一目了然,即把元音字母(a,e,i,o,u,A,E,I,O,U)写成大写的,辅音字母则都写成小写。

3.1 一次遍历 + ASCII – O(n)(⭐)

时间复杂度 O(n),空间复杂度 O(n)
在这里插入图片描述
ASCII中关于数字和大小写字母的起始位要牢记(如:字符‘0’ 对应的就是 48,字符‘A’ 对应的是 65,字符‘a’ 对应的是 97,其中‘A’ 和 ‘a’之间相差 32)

一旦我们掌握了以上的对应关系,本题就如同砍瓜切菜手到擒来。由于输入还是一个字符串,那么我们还是直接对这个字符串进行存储 str,为了方便编程遍历操作,我们可以通过 toCharArray() 方法将字符串转成字符数组,然后对这个数组 ch 进行遍历,当遇到字符为 小写元音字母(a,e,i,o,u)时,就将其转为大写字母,这里可以使用 ASCII值直接计算的方式实现,也可以使用 Character.toUpperCase() / Character.toLowerCase() 的方法实现(防止紧张忘记了‘A’ 和 ‘a’之间的差值是32)。字符数组遍历结束,不要忘了再把它拼接回字符串,这里我们可以使用 StringBuilder (相较于String来拼接,StringBuilder更有效率) 来对字符数组进行拼接。

NoteSystem.out.println(Object); 会默认调用这个 object 的toString()方法,所以在以下代码中就省略掉了 StringBuilder的toString()过程,转而直接使用System.out.println(StringBuilder)。

相关内容可参考:Java字符串大小写转换

import java.util.Scanner;
public class Vowel {
    public static void main(String[] args) {
        // please define the JAVA input here. For example: Scanner s = new Scanner(System.in);
        // please finish the function body here.
        // please define the JAVA output here. For example: System.out.println(s.nextInt());
        Scanner s = new Scanner(System.in);
        String str = s.nextLine();
        char[] ch = str.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            if (ch[i] == 'a' || ch[i] == 'e' || ch[i] == 'i' || ch[i] == 'o' || ch[i] == 'u') {
                ch[i] -= 32;
            } else if (ch[i] >= 'A' && ch[i] <= 'Z') {
                if (ch[i] != 'A' && ch[i] != 'E' && ch[i] != 'I' && ch[i] != 'O' && ch[i] != 'U')
                    ch[i] += 32;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < ch.length; j++) {
            sb.append(ch[j]);
        }
        System.out.println(sb);
    }
}

在这里插入图片描述

三、计算字符串重新排列数(100分)

1、题目描述

给定一个只包含大写英文字母的字符串 S,要求给出对 S 重新排列的所有不相同的排列数。
如:S 为 ABA,则不同的排列有 ABA、AAB、BAA 三种。

输入
输入一个长度不超过10的字符串S,我们确保都是大写的。

输出
输出S重新排列的所有不相同的排列数(包含自己本身)

2、测试用例

示例 1:

输入: “ABA”
输出: 3

示例 2:

输入: “AABBCC”
输出: 90

3、题解

老生常谈的题目,求字符串的全排列,具体内容可参考:【LeetCode】剑指 Offer 38. 字符串的排列 p197 – Java Version。

3.1 回溯 – O(n!n) (⭐)

时间复杂度 O(n!n),空间复杂度 O(n2)
在这里插入图片描述
实现过程
为了方便返回,我们首先定义了一个列表 res 用来存储全排列的字符串,接着通过 toCharArray() 方法将字符串转换为字符数组;定义 dfs(int idx) 方法,通过相应的控制条件实现对输入字符串长度的全排列 A(3,2) = 3! = 3 *2 *1 = 6;此外由于交换过程是可以复用的,可以写成 swap() 方法的形式;同时为了应对输入的字符串中可能含有重复的字符会导致排列形式重复的可能,可以引入 HashSet 通过contains()方法来判重,从而跳过该排列形式。

import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Offer38_Permutation {
    // 结果字符串存储
    public static List<String> res = new LinkedList<>();
    // 暂时存储
    public static char[] c;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] strings = permutation(str);
        for (String string : strings) {
            System.out.printf("%s,", string);
        }
    }

    public static String[] permutation(String s) {
        if (s == "") return null;
        // 将字符串转成字符数组
        c = s.toCharArray();
        // 全排列
        dfs(0);
        // 返回结果
        System.out.println(res.size());
        return res.toArray(new String[res.size()]);
    }

    public static void dfs(int idx){
        // 递归终止条件: 当前字符数组固定完毕
        if (idx == c.length-1){
            // 将该字符串存入结果列表
            res.add(String.valueOf(c));
            // 结束当前递归
            return;
        }

        // 利用HashSet给重复字符串的情况进行去重
        HashSet<Character> set = new HashSet<>();
        for (int i = idx; i < c.length; i++){
            // 判重,如果有重复的字符,则跳过当前循环,不进行记录
            if (set.contains(c[i])) continue;
            set.add(c[i]);
            swap(i,idx);
            dfs(idx+1);
            swap(i,idx);
        }
    }

    // 交换字符数组的两个字符的位置
    public static void swap(int a, int b){
        char temp = c[a];
        c[a] = c[b];
        c[b] = temp;
    }
}

在这里插入图片描述

四、参考资料

[1] 华为OJ-(1)word重量 &(2)元辅音大小写转换 & (3)计算字符串重新排列数
[2] 华为面试题–字符串重排

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据降维算法 | Matlab基于局部费歇尔判别(LFDA)的分类数据降维可视化

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 数据降维算法 | Matlab 基于局部费歇尔判别(LFDA)的分类数据降维可视化 部分源码 %--------------------

了解网卡的类型

网卡&#xff0c;即网络接口卡&#xff0c;也叫NIC卡&#xff0c;是一种允许网络连接的计算机硬件设备。网卡应用广泛&#xff0c;市场上有许多不同种类&#xff0c;如PCle网卡&#xff0c;服务器网卡。本文将对网卡的基础&#xff0c;功能&#xff0c;元件与类型进行全方位讲解…

用友自主研发企业商用版TimensionDB时序数据库重磅发布!

2023年4月19日&#xff0c;用友BIP技术大会上&#xff0c;用友自主研发专用企业服务能力的商用版时序数据库——TimensionDB重磅发布&#xff01;源于物联网、工业4.0等场景实践&#xff0c;打造自主、安全、可控的专业服务工业企业的轻量级、高性能、易使用的时序数据管理引擎…

linux-02-软件安装-centos7配置jdk、tomcat、lrzsz、项目部署(Git、Maven)

文章目录 Linux-Day02课程内容1. 软件安装1.1 软件安装方式1.2 安装JDKshell脚本里写 cd命令不生效 1.3 安装Tomcat1.3.1 Tomcat安装好多方便的自定义命令:1.3.2 Tomcat进程查看1.3.3 防火墙操作1.3.4 停止Tomcat 1.4 安装MySQL1.4.1 MySQL安装1.4.2 MySQL启动1.4.3 MySQL登录1…

PYQT5学习笔记04——QObject对象和属性名称设置API以及对应案例

一、QObject对象和属性名称设置API 简单介绍一下PyQt5最上层父类QObject的一些属性方法&#xff0c;并给出具体的使用过程示例。 1、setObjectName(“唯一名称”)和objectName() setObjectName方法的作用是给Qt对象设置一个名称&#xff0c;一般这个名称是唯一的&#xff0c;这…

Excel技能之实用技巧,高手私藏

今天来讲一下Excel技巧&#xff0c;工作常用&#xff0c;高手私藏。能帮到你是我最大的荣幸。 与其加班熬夜赶进度&#xff0c;不如下班学习提效率。能力有成长&#xff0c;效率提上去&#xff0c;自然不用加班。 消化吸收&#xff0c;工作中立马使用&#xff0c;感觉真不错。…

【Java】Eclipse如何创建java项目并运行

前面Eclipse、JDK的安装与JDK环境变量配置好了之后&#xff0c;开始进行基本的使用 一、创建java项目并运行 1、先打开Eclipse IDE 2、创建项目 点击左上角的File—>New—>Project&#xff0c;这样就可以新建一个Java的项目了。也就是说&#xff0c;在Eclipse中&#…

设置ubuntu开机启动脚本

一、新建xx-setpower.service文件 sudo gedit /etc/systemd/system/xx-setpower.service [Unit] DescriptionXX SetPower Service Afternetwork.target Wantsnetwork.target[Service] Typesimple PIDFile/run/take_up_boot.pid ExecStart/usr/bin/take_up_boot.sh Restarton-…

二进制码与格雷码的相互转换原理与Verilog实现

二进制码与格雷码的相互转换原理与Verilog实现 一、写在前面二、二进制码与格雷码的相互转换2.1 二进制码转格雷码原理2.2 异或运算的特性2.3 格雷码转二进制码原理 三、二进制码与格雷码相互转换的Verilog实现四、仿真验证五、写在后面 一、写在前面 二进制码是一种基于二进制…

RibbitMQ之RabbitMQ的介绍与安装

RabbitMQ的介绍与安装 1. MQ 的相关概念1.1 MQ 的概念1.2 MQ 的作用1.3 MQ 的分类1.3.1 ActiveMQ1.3.2 Kafka1.3.3 RocketMQ1.3.4 RabbitMQ 1.4 MQ 的选择 2. RabbitMQ2.1 RabbitMQ 的概念2.2 RabibitMQ 的四大核心2.3 RabbitMQ 的核心部分2.4 RabbitMQ 名词介绍2.5 安装 Rabbi…

数学建模第五天:数学建模算法篇之层次分析法AHP

目录 一、前言 1、例题 2、层次分析法用途 二、层次分析法步骤 1、建立层次结构图 2、构造两两比较矩阵 3、确定相对权重向量 ①特征根法 ②和法 4、一致性检验 5、计算层次总排序权值和一致性检验 一、前言 1、例题 有大学生刘昊、小王、阿三、蛋仔四人&#xff0…

闪电加密和隐藏加密文件夹忘记密码怎么办?

闪电加密和隐藏加密是文件夹加密超级大师的两种文件夹加密类型&#xff0c;它们都拥有超快的加密算法&#xff0c;可以瞬间加密超大文件夹。那么这两种文件夹加密类型忘记密码该怎么办呢&#xff1f;下面我们一起来了解一下吧。 闪电加密和隐藏加密文件夹找回密码 首先&#x…

HashMap的扩容机制、初始化容量大小的选择、容量为什么是2的次幂

前置知识 先来看看HashMap中的成员属性 解释&#xff1a; size当前的容器中Entry的数量&#xff0c;也就是当前K-V的数量loadFactory装载因子&#xff0c;用来衡量HashMap满的程度&#xff0c;loadFactory的默认值是0.75threshold临界值&#xff0c;当实际KV数量超过threshol…

ChatGPT实现语义分析情感分类

语义分析情感分类 我们从开源社区找到了中科院谭松波博士整理的携程网酒店评论数据集(https://raw.githubusercontent.com/SophonPlus/ChineseNlpCorpus/master/datasets/ChnSentiCorp_htl_all/ChnSentiCorp_htl_all.csv)。一共七千余条数据&#xff0c;包括 label 和 review …

Domino中的时间日期格式设置

大家好&#xff0c;才是真的好。 今天我们谈管理运维问题&#xff0c;相对于前面的技术来说&#xff0c;会简单很多。 就是Domino服务器运行时的时间日期显示问题。这和你的邮件、应用等里面的文档时间日期也有关系。 简单来说&#xff0c;在默认的设置情况下&#xff0c;Do…

java——最小的K个数

题目链接 牛客在线oj题——最小的K个数 题目描述 给定一个长度为 n 的可能有重复值的数组&#xff0c;找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围&#xff1a;0≤k,n≤10000&…

【刷题之路】LeetCode 206. 反转链表

【刷题之路】LeetCode 206. 反转链表 一、题目描述二、解题1、方法1——改变指针方向1.1、思路分析1.2、代码实现 2、方法2——头插到新链表2.1、思路分析2.2、代码实现 一、题目描述 原题连接&#xff1a; 206. 反转链表 题目描述&#xff1a; 给你单链表的头节点 head &…

4月26号软件更新资讯合集....

Tpflow V7.0.2&#xff0c;PHP 工作流引擎新版发布 ​欢迎使用 Tpflow V7.0.1 工作流引擎 TpFlow 工作流引擎是一套规范化的流程管理系统&#xff0c;基于业务而驱动系统生命力的一套引擎。彻底释放整个信息管理系统的的活力&#xff0c;让系统更具可用性&#xff0c;智能应用型…

设计模式天花板,详解23种设计模式+7大设计原则

这份文档完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起&#xff0c;包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等&#xff0c;让读者能系统、完整、准确地掌握每个模式&#xff0c;培养正确的“设计观”;中高级内容则深…

速速报名| 米尔将精彩亮相2023 STM32中国峰会暨粉丝狂欢节

STM32峰会已成功举办五届&#xff0c;第六届将于今年5月12日-13日在深圳重磅回归&#xff01;往年&#xff0c;米尔电子都作为官方合作伙伴&#xff0c;出席演讲并展出公司配套的核心板和开发板。 今年&#xff0c;STM32峰会更是集齐了值得你「点赞、收藏、转发」的一键三连精…