计算字母出现次数【存在括号计算】

news2025/2/13 23:02:06

计算字母出现次数【存在括号计算】

此代码考虑到了本问题的大多可能情况,闲话少述,代码中的注释很丰富。
代码绝对可以解决你的问题!
不行你就评论,回复速度超快
在这里插入图片描述

作者时间
YaoChongChong2023年6月14日10:40

Description of this problem
input:
AS2(D22F7Z)8(X3C1)8A9B1

mindset:
first of all,analysis:A1,S2,D22* 8,F7* 8,Z1* 8,X3* 8,C1* 8,A9,B1
and then,merge this numbers by the same character.
last,print this in sort of sequence by character dictionary.
output:
A10B1C8D176F56S2X24Z8

import java.util.Locale;
import java.util.Scanner;
import java.util.Stack;

/**
 * @Author: JarmanYao  【姚崇崇】
 * @Date: 2023/6/13 19:14
 */
public class countForEveryCharacterUtils {

    //主程序测试
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        countForEveryCharacter(input);
    }

    /**
     * 统计字符串中各字母出现的次数
     *
     * 我考虑的情况如下:
     * 1.输入存在大小写不一致
     * 2.跟随在字符后面的数字,可能是""【比如XYZ】,也可能是多位数【占据多位,比如X123Y98】
     * 3.考虑到括号存在乘法运算,我将括号临时独立运算,再将结果合并到最终结果数组中。
     *
     * @param str
     */
    public static void countForEveryCharacter(String str) {
        str = str.toUpperCase(Locale.ROOT);//如果输入存在小写,全部改写为大写
        int[] count = new int[26];//最终结果
        int[] countTem = new int[26];//暂存括号运算结果
        for(int i=0;i<str.length();i++){

            //考虑括号情况:
            int k = i;
            int kuoHaoFlag = 1;
            boolean flag = false;
            if(str.charAt(k)=='('){//这个左括号,是独立区域的最外侧括号的左半部分
                Stack<Character> stack = new Stack<>();
                do{
                    flag=false;
                    if (str.charAt(k)==')'){
                        Stack<Character> stackTem = new Stack<>();
                        int[] nu = get_numberAfterChar_and_nextIndex(k,str);//获取最里面的括号的右侧那个数nu[0],进行乘法运算(在临时的countTem数组进行)
                        while(stack.size()!=0 && stack.peek()!='(') {
                            stackTem.push(stack.peek());
                            countTem[stack.pop()-'A'] *= nu[0];//乘法运算

                        }
                        if (stack.peek()=='('){//这对括号,被干掉了,kuoHaoFlag记录括号数目,进行-1操作
                            stack.pop();
                            kuoHaoFlag--;
                            //如果这是最后一个左括号:
                            if (stack.size()==0) {
                                flag = true;
                            }
                        }
                        while(stackTem.size()!=0){//拿出来的还得再放回去,防止左括号还没有被匹配消除完:上面这些弹出来的内容还有再进行乘法操作的可能
                            stack.push(stackTem.pop());
                        }
                        k = nu[1];
                        i=k;//将i移动到下一个非数字字符的位置【nu[1]已经将‘(’除外】
                        continue;
                    }
                    if (str.charAt(k)=='('){//如果又发现了内部括号
                        stack.push(str.charAt(k));//左括号入栈
                        if (k!=str.indexOf('(')) kuoHaoFlag++;//括号对数+1
                        k++;
                        i=k;
                        continue;
                    }

                    stack.push(str.charAt(k));//往栈里面压字符
                    int[] nu = get_numberAfterChar_and_nextIndex(k,str);//获取被压进栈中那个字符后面对应的数目,以及下一步i应该调到哪里
                    countTem[str.charAt(k)-'A'] += nu[0];
                    k = nu[1];//已经包含了k++
                    i=k;
                }while((flag||kuoHaoFlag>=1) && k<str.length());

                //将括号运算结果合并到之前左侧的旧结果。
                for (int j = 0; j < 26; j++) {
                    count[j]+=countTem[j];
                }
                countTem = new int[26];//对临时数组 刷新初始化覆盖旧缓存
                i--;
                continue;
            }
            //正常情况下,操作如下:
            int[] nu = get_numberAfterChar_and_nextIndex(i,str);
            count[str.charAt(i)-'A'] += nu[0];
            i = nu[1]-1;
        }
        for (int i = 0; i < count.length; i++) {
            if (count[i] != 0) {
                System.out.print((char) (i + 'A'));
                System.out.print(count[i]);
            }
        }
    }

    /**
     * 获取:
     *  1.str中位于i处的字符,他紧挨着右边的出现次数【存放在 结果数组的[0]】
     *  2.i在接下来应该调整到的位置【存放在 结果数组的[1]】
     * @param i
     * @param str
     * @return
     */
    public static int[] get_numberAfterChar_and_nextIndex(int i, String str){
        int j = i+1;
        String num = "";
        if (j>=str.length()){
            num="1";
        }else {
            while (j<str.length() && str.charAt(j) >= '0' && str.charAt(j) <= '9') {
                num += str.charAt(j);
                j++;
            }
            if (num.equals("")){
                num="1";
            }
        }
        int[] result = {Integer.parseInt(num), j};
        return result;
    }
}

在这里插入图片描述

总结: 我自想解决算法写代码的过程,遇到了两次bug,当然,这属于代码自测环节,利用idea丰富的调试工具,快速地定位了问题所在,再迅速进行代码调整。最终也是搞定了这个代码。其实,原题中的描述,比我上面写的案例简单了很多,我考虑的更多了点。
要是在公司里,这我肯定先存着不交付它,哈哈哈,万一咱想的多,但是不符合下游的要求呢【交付的一定是仅仅能解决需求方的描述即可,如果存在想法,可以先沟通,再出力】。但是面试笔试就尽量展示自己的考虑全面吧。

兄弟看好你,点个赞吧。
在这里插入图片描述

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

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

相关文章

T8151B T8310 T8311罗克韦尔自动化可信通信接口

​ T8151B T8310 T8311罗克韦尔自动化可信通信接口 T8151B T8310 T8311罗克韦尔自动化可信通信接口 DCS控制器正反作用怎么判断&#xff1f; dcs控制器的正反作用可以在工程师站更改&#xff0c;比如中控系统那就在工程师站的操作界面把控制系统上的调节阀位号点开就会有正反作…

【华为云分布式消息服务RocketMQ】

MD[华为云分布式消息服务RocketMQ] 华为云分布式消息服务RocketMQ,使用指南 说明1&#xff1a;华为云rocketmq默认是集群4.8版本&#xff0c;而非单机版。 说明2&#xff1a;华为云rocketmq兼容性较好&#xff0c;一般不需要进行SDK改造。 1.创建/购买分布式消息服务RocketM…

水文水动力模型在城市内涝、城市排水、海绵城市规划设计中教程

详情点击链接&#xff1a;水文水动力模型在城市内涝、城市排水、海绵城市规划设计中应用教程 一&#xff0c;CAD、GIS水力建模过程 1.1复杂城市排水管网系统快速建模&#xff1a;通过标准化的步骤&#xff0c;利用CAD数据、GIS数据建立SWMM模型。在建模的不同阶段发挥不同软…

生成AI(三)—创建自己的MidJorney

背景&#xff1a;MidJorney是面向互联网的图像AIGC产品&#xff0c;在政企内部&#xff0c;存在大量需求训练内部的知识作为自己的AIGC工具。基本需求是信息安全考虑&#xff0c;合规考虑。 目标&#xff1a;通过自准备的数据训练MidJorney同类模型&#xff0c;成为私有化部署…

【基于容器的部署、扩展和管理】3.9 云原生容器的安全性和合规性

往期回顾&#xff1a; 第一章&#xff1a;【云原生概念和技术】 第二章&#xff1a;【容器化应用程序设计和开发】 第三章&#xff1a;【3.1 容器编排系统和Kubernetes集群的构建】 第三章&#xff1a;【3.2 基于容器的应用程序部署和升级】 第三章&#xff1a;【3.3 自动…

关于Android的帧动画,补间动画,属性动画的使用和总结。(附源码)

说明&#xff1a;内容有点多&#xff0c;可以分块阅读&#xff0c;后续可能会拆分为三讲 一. Android的动画总结 一 . 帧动画 帧动画其实就是通过连续播放图片来模拟动画效果 以下是俩种实现方式&#xff1a; 1. xml文件的方式 首先在drawable下建立animation_lufi.xml <?…

视频剪辑需要学哪些软件 视频剪辑在哪里学

视频剪辑涉及到素材准备、视频的编辑与生成、格式的转换等方面&#xff0c;因此需要学习到的软件类型也不少。比如在准备素材时&#xff0c;可能会涉及到音频、图片等处理&#xff0c;以及特效的应用等。接下来&#xff0c;就让我们详细了解下视频剪辑需要学哪些软件&#xff0…

如何进行安全技术交底

安全技术交底是一项非常重要的安全管理工作&#xff0c;对于保障施工现场的安全和人员的生命安全具有不可替代的作用。那么作为公司管理层如何实时了解安全技术交底的执行情况&#xff0c;工作人员是否做到认真、安全、彻底执行&#xff1f; 有没有更好、更简便低成本的方法来做…

利好再现!股、债携手上涨将继续?

政策支持继续&#xff0c;6月13日&#xff0c;国家发改委等部门印发《关于做好2023年降成本重点工作的通知》&#xff0c;助力经济运行整体好转。当日&#xff0c;央行公开市场操作中7天逆回购中标利率也下调10个基点&#xff0c;市场对于6月降息预期越来越浓了。带动A股市场震…

Spark SQL数据源:JSON数据集

文章目录 一、读取JSON文件简介二、读取JSON文件案例演示&#xff08;一&#xff09;创建JSON文件并上传到HDFS&#xff08;二&#xff09;读取JSON文件&#xff0c;创建临时表&#xff0c;进行关联查询1、读取user.json文件&#xff0c;创建临时表t_user2、读取score.json文件…

高速视觉筛选机PCI Express实时运动控制卡XPCIE1028

产品导读 正运动技术的PCI Express总线运动控制卡XPCIE1028&#xff0c;具备位置锁存、多维高速硬件位置比较输出PSO、同步跟随、精准触发的运动控制和I/O控制功能。 配合正运动技术MotionRT7实时内核使用&#xff0c;可高度满足高速视觉筛选机应用所需的运动控制需求。 XPC…

png转jpg,直接改后缀?

通过把.png改为.jpg可以改变图片的格式么&#xff1f; 将PNG文件扩展名改为JPEG的扩展名&#xff08;.jpg或.jpeg&#xff09;不会更改图像的格式。它只是更改了文件扩展名&#xff0c;这可能导致一些图像查看器和编辑器无法正确识别和处理该文件。 PNG和JPEG是两种不同的图像文…

揭秘水文覆盖变化!使用 R 语言轻松处理 GRACE.nc 文件

一、引言 在今天越来越严重的气候变化条件下&#xff0c;水文覆盖成为了越来越多研究者重视的话题。水文覆盖指的是地表或植被表面被水覆盖的面积&#xff0c;包括河流、洼地、湖泊、蓄水池等。它反应了一个地区的水资源分布、水域利用等情况&#xff0c;对于水资源管理和自然…

centos7中docker安装单机版本及对应的分布式应用中心【亲测可用】

第一部分&#xff1a;安装docker篇 1.安装docker&#xff0c;sudo为以管理员身份运行,如当前登录为root用户&#xff0c;加上也不影响 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-…

在不安装ghostscript软件情况下,Windows中将ghostscript DLL(gsdll64.dll)库提供给python,并将资源打包进exe

1. 先安装ghostscript软件&#xff0c;将安装后的文件夹复制到项目文件夹下 2. 安装ghostscript&#xff0c;修改代码调用gsdll64.dll文件 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple ghostscript 将ghostscript 库安装的文件夹复制到项目文件夹下&#xff…

信贷产品的贷前获客营销策略搭建

在竞争激烈的信贷市场中&#xff0c;有效的贷前获客营销策略对于吸引潜在借款人、提高转化率以及保持客户忠诚度至关重要。本文将分享一些关于信贷产品贷前获客营销策略搭建的基本框架和经验分享&#xff0c;希望能对大家有所启发。 1、市场调研和目标客户定义 在制定贷前获客…

20230614使用360安全卫士的断网急救箱解决不能上网的问题

20230614使用360安全卫士的断网急救箱解决不能上网的问题 2023/6/14 12:29 未连接到互联网 网络连接错误&#xff0c;请检查您的网络设置 刷新 无法访问此网站youtube.com 的响应时间过长。 请试试以下办法&#xff1a; 检查网络连接 检查代理服务器和防火墙 运行 Windows 网…

小程序步骤条实现

步骤条实现 <template><view class"contractInfo"><view class"contractInfo_center" style"overflow-y: auto; display: flex; overflow-y: hidden"><view class"contractInfo_center_block" v-for"(ite…

AI推文三天百万播放项目拆解

小说推文是之前操作的第一个入局的项目&#xff0c;很快就跑通了0-1&#xff0c;但是实践三个月后我决定从入⻔到放弃&#xff0c;但是大家可以借鉴一下这个项目操作经验&#xff0c;网上报了两个推文项目的陪跑199299,分享一下这个经验&#xff0c;大家可以提提意⻅。 为什么…

自动驾驶专题介绍 ———— 激光雷达标定

文章目录 介绍激光雷达与激光雷达之间的外参标定激光雷达与摄像头的标定 介绍 激光雷达在感知、定位方面发挥着重要作用。跟摄像头一样&#xff0c;激光雷达也是需要进行内外参数标定的。内参标定是指内部激光发射器坐标系与雷达自身坐标系的转换关系&#xff0c;在出厂之前就已…