华为笔试题 之 简易压缩算法

2024-06-13 05:18

本文主要是介绍华为笔试题 之 简易压缩算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目

有一种简易压缩算法:针对由全部小写字母组成的字符串,将其中连续超过两个相同字目的部分压缩成连续个数加该字母,其他部分保持原样不变。

例如,字符串:aaabccccd 经过压缩成为字符串:3ab4cd。请您编写一个unZip函数,根据输入的字符串,判断其是否为合法压缩过的字符串。
若输入合法,则输出解压后的字符串,否则输出:!error 来报告错误。

测试:3ab4cd合法,aa4b合法,caa4b合法,3aa4b不合法,22aa不合法,2a4b不合法,22a合法

二、代码

package com.huawei.nowcoder;import com.sun.istack.internal.NotNull;
import java.util.Scanner;public class MyTest2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String in = sc.nextLine();if (null == in || in.trim().equals("")) {return;}System.out.println(unZip(in.toCharArray()));}/*** 解压* @param input* @return*/private static String unZip(char[] input) {if (!checkInput(input, null)) {System.out.println("!error");return "";}StringBuilder strUnZip = new StringBuilder();int i = 0, len = input.length;while (i < len) {char c = input[i];if (Character.isDigit(c)) {StringBuilder countSb = new StringBuilder();countSb.append(c);char nextC = c;int nextI = i + 1;if (nextI < len && Character.isDigit(input[nextI])) {// 输入字符串长度大于1,截取剩余部分递归用char[] remain = new char[len - nextI];System.arraycopy(input, nextI, remain, 0, (len - nextI));// 下一个也为数字时,要和当前数字组合成一个整数nextC = findCount(remain, countSb);} else if (nextI < len) {nextC = input[nextI];}int count = Integer.parseInt(countSb.toString());for (int s = 0; s < count; s++) {strUnZip.append(nextC);}i = nextI + countSb.length();} else {strUnZip.append(c);i ++;}}return strUnZip.toString();}/*** 获取字母前的数字,比如:123a,获取到123,返回a* @param input* @param countSb* @return*/private static char findCount(char[] input, StringBuilder countSb) {// 如果剩最后一个,肯定是小写字母int len = input.length;char c = input[0];if (len == 1) {return c;}countSb.append(c);char nextC = input[1];if (Character.isDigit(nextC)) {char[] remain = new char[len - 1];System.arraycopy(input, 1, remain, 0, len - 1);return findCount(remain, countSb);} else {return nextC;}}/*** 校验合法性,非法返回false* @param input* @param lastChar* @return*/private static boolean checkInput(@NotNull char[] input, Character lastChar) {if (null == input || input.length == 0) {return false;}int len = input.length;char c = input[0];// 只有一个字符且为小写字母if (len == 1 && Character.isLowerCase(c)) {return true;}// 输入字符串长度大于1,截取剩余部分递归用char[] remain = new char[len - 1];System.arraycopy(input, 1, remain, 0, len - 1);char nextC = input[1];boolean flag = false;// 3ab4cd合法,aa4b合法,caa4b合法,3aa4b不合法,22aa不合法,2a4b不合法,22a合法if (Character.isDigit(c)) {if (Character.isLowerCase(nextC)) {if (null == lastChar && Integer.parseInt(String.valueOf(c)) > 2) {// 下一个字符如果是小写字母,则该数字要大于2flag = true; // 第一个} else if (lastChar != null && Character.isDigit(lastChar)) {// c是数字,c前面字符也是数字时,合法flag = true;} else if (lastChar != null && Character.isLowerCase(lastChar)) {if (Character.isLowerCase(nextC) && Integer.parseInt(String.valueOf(c)) > 2) {// c前面是小写字母,如果c后面是字母,则c必须大于2flag = true;} else if (Character.isDigit(nextC)) {// 如果c后面是数字时合法flag = true;}}} else if (Character.isDigit(nextC)) {flag = true;}} else if (Character.isLowerCase(c)) {// 为小写字母时,后面跟着的相同字母不能超过2个if (null == lastChar) {flag = true; // 第一个} else if (Character.isLowerCase(lastChar)) {if (lastChar == c && lastChar != nextC) {flag = true;} else if (lastChar != c) {flag = true;}} else if (Character.isDigit(lastChar) && c != nextC) {flag = true;}}return flag && checkInput(remain, c);}
}

三、测试

3ab4cd
aaabccccd
aa4b
aabbbb
caa4b
caabbbb
22aa
!error
2a4b
!error
4a5b22c
aaaabbbbbcccccccccccccccccccccc

这篇关于华为笔试题 之 简易压缩算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056383

相关文章

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

使用PyQt实现简易文本编辑器

《使用PyQt实现简易文本编辑器》这篇文章主要为大家详细介绍了如何使用PyQt5框架构建一个简单的文本编辑器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录分析主窗口类 (MyWindow)菜单操作语法高亮 (SyntaxHighlighter)运行程序主要组件代码图示分析实现

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

用Java打造简易计算器的实现步骤

《用Java打造简易计算器的实现步骤》:本文主要介绍如何设计和实现一个简单的Java命令行计算器程序,该程序能够执行基本的数学运算(加、减、乘、除),文中通过代码介绍的非常详细,需要的朋友可以参考... 目录目标:一、项目概述与功能规划二、代码实现步骤三、测试与优化四、总结与收获总结目标:简单计算器,设计

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

通过C#和RTSPClient实现简易音视频解码功能

《通过C#和RTSPClient实现简易音视频解码功能》在多媒体应用中,实时传输协议(RTSP)用于流媒体服务,特别是音视频监控系统,通过C#和RTSPClient库,可以轻松实现简易的音视... 目录前言正文关键特性解决方案实现步骤示例代码总结最后前言在多媒体应用中,实时传输协议(RTSP)用于流媒体服

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述