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

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

相关文章

用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+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

华为OD机试真题-学生方阵-2024年OD统一考试(E卷)

题目描述 学校组织活动,将学生排成一个矩形方阵。 请在矩形方阵中找到最大的位置相连的男生数量。这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的。 注:学生个数不会超过10000 输入描述 输入的第一行为矩阵的行数和列数, 接下来的 n行为矩阵元素,元素间用""分隔。 输出描述 输出一个整数,表示矩阵中最长的位

海龟绘图简易教程|Turtle for Python

turtle 是 python 内置的一个比较有趣味的模块,俗称 海龟绘图,它是基于 tkinter 模块打造,提供一些简单的绘图工具,海龟作图最初源自 20 世纪 60 年代的 Logo 编程语言,之后一些很酷的 Python 程序员构建了 turtle 库,让其他程序员只需要 import turtle,就可以在 Python 中使用海龟作图。 原文链接|海龟绘图简易教程 1. 基本

两道笔试题

“char a='\72'”是什么意思? 这么理解:\为转义字符,\072转义为一个八进制数072,也就是十进制数的58买一送一,将转义字符对照表也一并贴给你吧:转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) 008 \f 换页(FF) 012 \n 换行(LF) 010 \r 回车(CR) 013 \t 水平制表(HT) 009 \v 垂直制表(VT

华为 HCIP-Datacom H12-821 题库 (13)

有需要题库的可以看主页置顶 1.可以携带外部路由的 tag 标签信息的是以下哪一类 LSA? A、4 类 LSA B、5 类 LSA  C、3 类 LSA  D、2 类 LSA 答案:B 解析: 暂无解析 2..两台路由器直连,并设定网络类型为 p2p 建立OSPF 邻居。那么两台路由器传输 OSPF 报文的目的 IP 地址是以下哪一项? A、使用组播地址 224.0.0.6 B