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

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

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

作者时间
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丰富的调试工具,快速地定位了问题所在,再迅速进行代码调整。最终也是搞定了这个代码。其实,原题中的描述,比我上面写的案例简单了很多,我考虑的更多了点。
要是在公司里,这我肯定先存着不交付它,哈哈哈,万一咱想的多,但是不符合下游的要求呢【交付的一定是仅仅能解决需求方的描述即可,如果存在想法,可以先沟通,再出力】。但是面试笔试就尽量展示自己的考虑全面吧。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【gcc, cmake, eigen, opencv,ubuntu】五.CMakeLists.txt编写

文章目录 CMakeLists.txt编写1.CMakeLists.txt模板2.设置编程语言版本3.设置编译类型Debug&#xff0c;Release4.设置获取文件列表5.添加include目录6.配置编译选项 CMakeLists.txt编写 1.CMakeLists.txt模板 一个使用opencv 的 CMakeLists.txt # cmake最低版本要求 cmake_m…

该怎么学Python?自学Python的方法和资料整理!

导语 Python 作为一门简洁、易学且功能强大的编程语言&#xff0c;备受程序员和初学者的喜爱。如果你也想学习 Python&#xff0c;但不知从何入手&#xff0c;本文将为你整理一些自学 Python 的方法&#xff0c;助你快速入门并掌握这门语言。 为什么学习Python&#xff1f;&a…

requests库的使用

文章目录 get 请求post 请求get 请求和 post 请求的区别response1. res.headers2. status_code3. json get 请求 参数类型作用urlstr发起请求的地址params字典url为基准地址&#xff0c;不包含查询参数&#xff1b;使用此参数会自动对 params 字典编码&#xff0c;然后和url拼…

函数参数的拓展

函数参数的默认值 C 中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供默认参数的值&#xff0c;则使用默认值 参数的默认值必须在函数声明中指定 当函数声明时没有出现参数的默认值&#xff0c;而定义的时候出现参数的默认值&#xff0c;编译器会报错 当函数声…

看了这几个C语言例子,你一定和我一样连说5个卧槽,声音一次比一次大

曾经我一直以为自己C语言学的还挺好的&#xff0c;直到看到这几个例子。 例1 首先来看一下&#xff0c;大师是如何求圆周率的&#xff0c;一口君实在词穷&#xff0c;first卧槽。 #include <stdio.h>long a10000,b0,c10000,d,e,f[10001],g;void main(){for(;b ! c; f[…

nginx的安装及代理和负载均衡设置

一、通过yum方式进行安装 官网参考地址&#xff1a;https://nginx.org/en/linux_packages.html#RHEL 1.1 安装好依赖 执行下面的命令安装 sudo yum install yum-utils1.2、 先配置好yum源 新建文件/etc/yum.repos.d/nginx.repo&#xff0c;文件内容&#xff1a; [nginx-s…

Spark SQL数据源:Hive表

文章目录 一、Spark SQL支持读写Hive二、Spark配置hive-site.xml三、准备工作&#xff08;一&#xff09;启动Hive的metastore&#xff08;二&#xff09;启动Spark Shell 四、Spark读写Hive数据&#xff08;一&#xff09;导入SparkSession&#xff08;二&#xff09;创建Spar…

内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 )

内网安全&#xff1a;Cobalt Strike 与 MSF 联动&#xff08; 会话 相互转移 &#xff09; 在渗透中&#xff0c;有时候 Cobalt Strike 会话可能会受限制&#xff0c;所以我们需要把 Cobalt Strike 会话转移到 MSF 上进行后面的渗透。也有的时候会话在 MSF 上&#xff0c;但是…

MySQL数据库的认识及基础命令操作

目录 一、数据库的基本概念 1、数据库定义 &#xff08;1&#xff09; 数据 &#xff08;2&#xff09;表 &#xff08;3&#xff09; 数据库 2、 数据库管理系统&#xff08;DBMS&#xff09; 3、 数据库系统&#xff08;DBS&#xff09; 二、数据库系统发展史 1、 第一…

编程必备:JAVA多线程详解

目录 前言 1.入门多线程 1.1. 线程、进程、多线程、线程池 1.2.并发、串行、并行 1.3. 线程的实现方式 1.3.1. 继承 Thread 类 1.3.2. 实现 Runnable 接口 1.3.3. 使用 Callable 和 Future 1.3.4. 使用线程池 1.4.线程的状态 1.5. 线程常用方法 1.5.1 sleep() 1.4…

docker 网络理论知识点 - CNM 和命名空间

Network 目录 1 network namespace1.1 动手小实验 2 回到 docker2.1 driver and docker02.2 network2.3 网桥 docker0 3 总结 1 network namespace 1.1 动手小实验 网络命名空间。linux kernel 提供的网络虚拟化的功能。创建多个隔离的网络空间。每个空间内 firewall, ether …

【taro react】---- 解决H5接入uni-app版本的IM

1. 问题 由于项目开发比较紧张&#xff0c;腾讯 IM 的接入就使用了 TUIKit 含UI集成方案&#xff0c;遇到的问题&#xff0c;uni-app的UI本来就是一个单独的项目&#xff0c;需要集成到现有的 Taro React 中&#xff0c;就只能作为一个独立的项目&#xff0c;不跳转时不影响原有…

在十四届蓝桥杯开赛前一星期开始复习

文章目录 十三届蓝桥杯国赛原题1.20222.钟表3卡牌4最大数字4.5 Dijkstra算法5出差 十三届蓝桥杯国赛原题 1.2022 #include<iostream> using namespace std;long long int f[2023][11][2023]; //表示前2022个物品选择10个物品&#xff0c;体积总和为2022的方案个数 ,,数…

入门编程其实也简单

随着信息技术的快速发展&#xff0c;编程已经成为一个越来越重要的技能。那么&#xff0c;我们该如何入门编程呢&#xff1f; 编程是指使用计算机语言编写计算机程序的过程。计算机程序是一系列指令的集合&#xff0c;这些指令告诉计算机要执行的操作。编程的目的是创建计算机…

Unity编辑器扩展-第二集-按钮排序/分组/放入右键菜单

第一集链接&#xff1a;Unity编辑器扩展-第一集-在菜单栏加入自己的按钮_菌菌巧乐兹的博客-CSDN博客 一、本节目标效果展示 1.按钮排序 变成 2.按钮分组 仔细看&#xff0c;有个灰色的杠杠 3.放入右键菜单 4.皮一下 二、按钮排序具体流程 第一集讲&#xff0c;如果想放入…

阿里云PAIx达摩院GraphScope开源基于PyTorch的GPU加速分布式GNN框架

作者&#xff1a;艾宝乐 导读 近期阿里云机器学习平台 PAI 团队和达摩院 GraphScope 团队联合推出了面向 PyTorch 的 GPU 加速分布式 GNN 框架 GraphLearn-for-PyTorch(GLT) 。GLT 利用 GPU 的强大并行计算性能来加速图采样&#xff0c;并利用 UVA 来减少顶点和边特征的转换和…

4.4.2 译码器

1. 学习基础知识&#xff1a;首先&#xff0c;我会了解译码器的基本概念、原理和应用。通过阅读教科书、参考资料或在线资源&#xff0c;我会学习译码器的工作原理、不同类型的译码器以及它们在电子系统中的应用场景。 2. 研究示例和练习题&#xff1a;为了更好地理解译码器的…

【Spring】透过Spring源码查看Bean的命名转换规则

近期在写Spring项目的时候&#xff0c;需要通过注解的形式去替代之前直接将Bean存放在Spring容器这种方式&#xff0c;以此来简化对于Bean对象的操作&#xff0c;但是这样无法通过准确的Id去获取到相应的Bean对象了 测试观察 首先&#xff0c;如果要将指定的对象存放到Spring中…

Unity入门6——光源组件

一、参数面板 二、参数介绍 Type&#xff1a;光源类型 Spot&#xff1a;聚光灯 Range&#xff1a;发光距离Spot Angle&#xff1a;光锥角度Directional&#xff1a;方向光Point&#xff1a;点光源Area&#xff08;Baked Only&#xff09;&#xff1a;面光源 仅烘焙。预先算好&…

操作教程:如何正确配置让EasyNVR级联至EasyNVS平台?

EasyNVS是EasyNVR的云管理平台&#xff0c;可实现内网监控上云&#xff0c;视频汇聚等功能。近期经常有用户咨询EasyNVR如何级联至EasyNVS平台进行云端统计和管理&#xff0c;在今天的文章中&#xff0c;我们来详细介绍一下。 1、配置EasyNVS 1&#xff09;运行EasyNVS之前&a…