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

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

相关文章

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

定价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