NetEase网易 Java笔试题 给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、“b“、“c”、“x”、“y“、“z”在字符串中都恰好出现了偶数次(0也是偶数)

简介: NetEase网易 Java笔试题 给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、“b“、“c”、“x”、“y“、“z”在字符串中都恰好出现了偶数次(0也是偶数)

给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、"b"、“c”、“x”、"y"、“z”在字符串中都恰好出现了偶数次(0也是偶数)

题目描述

给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、“b”、“c”、“x”、“y”、“z”在字符串中都恰好出现了偶数次(0也是偶数)


输入例子1:

abcda

输出例子1:

1

例子说明1:

子串中只有d满足要求

输入例子2:

acmdcb

输出例子2:

4

例子说明2:

子串中cmdc满足要求


题目分析

使用HashMap来存放数据。Key存放“a”、“b”、“c”、“x”、“y”、“z”的状态,Value存放长度,int型变量maxLen存放最长字串长度。


在Key中,“a”、“b”、“c”、“x”、“y”、“z”各占一位标志位,对于字符串s,对其进行遍历,如果发现字符为“a”、“b”、“c”、“x”、“y”、“z”其中一个,则改变Key中对应的标志位。字符串中出现过奇数次上述字符,则对应位置为1,否则为0。如果出现已经出现过的标志位,则证明从出现过标志位的位置到现在满足“a”、“b”、“c”、“x”、“y”、“z”在字符串中都恰好出现了偶数次(0也是偶数)这一条件,可直接用当前的Value减去上次出现该标志位的Value,然后与当前的maxLen对比取大值即可。


代码实现

import java.util.*;
public class Main{
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        String next = scanner.next();
        System.out.println(findTheLongestSubstring(next));
    }
    private static int findTheLongestSubstring(String s)
    {
        Map<Integer, Integer> map = new HashMap<>();
        int state = 0;
        int maxLen = 0; 
        map.put(0, -1);   
        for (int i = 0; i < s.length(); i++)
        {           
            if (s.charAt(i) == 'a')
                state ^= 0x000001;      
            if (s.charAt(i) == 'b')
                state ^= 0x000010;      
            if (s.charAt(i) == 'c')
                state ^= 0x000100;       
            if (s.charAt(i) == 'x')
                state ^= 0x001000;       
            if (s.charAt(i) == 'y')
                state ^= 0x010000;       
            if (s.charAt(i) == 'z')
                state ^= 0x100000;       
            if (map.containsKey(state))
            {            
                maxLen = Math.max(maxLen, i - map.get(state));         
            }
            else
            {     
                map.put(state, i);  
            }   
        }     
        return maxLen;   
    }
}
目录
相关文章
|
2月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
215 14
|
2月前
|
SQL JSON Java
告别拼接噩梦:Java文本块让多行字符串更优雅
告别拼接噩梦:Java文本块让多行字符串更优雅
375 82
|
3月前
|
搜索推荐 算法 Java
2025 年互联网大厂校园招聘 JAVA 工程师笔试题及备考要点解析
本文针对互联网大厂校招Java工程师笔试题进行解析,涵盖基础知识、面向对象编程、数据结构与算法、异常处理及集合框架等核心内容。从数据类型、运算符到流程控制语句,从类与对象、继承多态到数组链表、排序算法,再到异常捕获与集合框架应用,结合实际案例深入剖析,助你系统掌握考点,提升应试能力。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
161 9
|
3月前
|
Java 数据库连接 API
互联网大厂校招 JAVA 工程师笔试题解析及常见考点分析
本文深入解析互联网大厂校招Java工程师笔试题,涵盖基础知识(数据类型、流程控制)、面向对象编程(类与对象、继承与多态)、数据结构与算法(数组、链表、排序算法)、异常处理、集合框架、Java 8+新特性(Lambda表达式、Stream API)、多线程与并发、IO与NIO、数据库操作(JDBC、ORM框架MyBatis)及Spring框架基础(IoC、DI、AOP)。通过技术方案讲解与实例演示,助你掌握核心考点,提升解题能力。
169 2
|
3月前
|
设计模式 算法 Java
2025 春季校招 Java 研发笔试题详细解析及高效学习指南
本指南专为2025春季校招Java研发岗位笔试设计,涵盖Java 17+新特性(如模式匹配、文本块、记录类和密封类)、现代技术栈(Spring Boot 3、响应式编程、Stream API增强)以及算法与数据结构实战。同时深入解析Spring Data JPA、事务管理、性能优化等内容,并结合实际案例讲解常见算法题解与设计模式应用。资源包含核心知识点、面试题及笔试技巧,助力高效备考。下载地址:[链接](https://pan.quark.cn/s/14fcf913bae6)。
86 1
|
3月前
|
存储 算法 NoSQL
2025 春季校招 java 研发岗位笔试题及相关内容
这份指南针对2025春季校招Java研发岗位,系统梳理了笔试核心知识点。内容涵盖Java基础(关键字、数据类型、循环与条件判断)、集合框架(List、Set、Map)、多线程(创建、同步、休眠与等待)以及异常处理(类型与机制)。通过典型例题解析与实践指导,帮助求职者掌握解题思路,提升编程能力,为成功通过校招笔试奠定基础。资源链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)
132 0
|
6月前
|
存储 缓存 安全
Java字符串缓冲区
字符串缓冲区是用于处理可变字符串的容器,Java中提供了`StringBuffer`和`StringBuilder`两种实现。由于`String`类不可变,当需要频繁修改字符串时,使用缓冲区更高效。`StringBuffer`是一个线程安全的容器,支持动态扩展、任意类型数据转为字符串存储,并提供多种操作方法(如`append`、`insert`、`delete`等)。通过这些方法,可以方便地对字符串进行添加、插入、删除等操作,最终将结果转换为字符串。示例代码展示了如何创建缓冲区对象并调用相关方法完成字符串操作。
141 13
|
6月前
|
存储 缓存 安全
Java 字符串详解
本文介绍了 Java 中的三种字符串类型:String、StringBuffer 和 StringBuilder,详细讲解了它们的区别与使用场景。String 是不可变的字符串常量,线程安全但操作效率较低;StringBuffer 是可变的字符串缓冲区,线程安全但性能稍逊;StringBuilder 同样是可变的字符串缓冲区,但非线程安全,性能更高。文章还列举了三者的常用方法,并总结了它们在不同环境下的适用情况及执行速度对比。
166 17
|
10月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
244 83