第一个只出现一次的字符(Java)

2023-11-19

题目:

在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。

第一思路:借助于数组来做。

开辟一个长度为26的数组,用来存放字符串中每个字符出现的次数。这样第一次扫描去统计这个字符串中字符出现的次数,第二次去统计第一个出现结果为1的次数,并输出对应的字符。

public class Main {
    //输出0代表没有满足条件的
	public static char findFirstNoRepeatChar(String str){
		if(str == null || str.trim().length()==0){
			return '0';
		}
		int []counts = new int[26];
		str = str.toLowerCase(); //防止出现大小写混乱的情况
		int len = str.length();
		for(int i = 0; i < len; i++){
			counts[str.charAt(i) - 'a']++;
		}
		for(int i = 0; i < len; i++){
			if(counts[str.charAt(i) - 'a'] == 1){
				return str.charAt(i);
			}
		}
		return '0';
	}
	
	public static void main(String[] args) {
		System.out.println(findFirstNoRepeatChar("abaccdeff"));
	}
}

小结:上面开辟的一个数组,其实就是为了让a~z对应。故演化出来的第二种做法就是利用带有<k,v>键值对的形式来解决问题。

第二思路:借助于HashMap来做。

借助于HashMap天然的集合优势,<k,v>键值对的形式,k存储字符,v存储出现的次数。故借此来找到第一个只出现一次的字符。

代码实现:

public class Main1 {

	public static char findFirstNoRepeatChar(String str){
		if(str == null || str.trim().length()==0){
			return '0';
		}
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		str = str.toLowerCase(); //防止出现大小写混乱
		int len = str.length();
		int count = 0;
		for(int i = 0; i < len; i++){
			if(map.containsKey(str.charAt(i))){
				count = map.get(str.charAt(i));
				map.put(str.charAt(i), ++count);
			}else{
				map.put(str.charAt(i), 1);
			}
		}
		for(int i = 0; i < len; i++){
			if(map.get(str.charAt(i)) == 1){
				return str.charAt(i);
			}
		}
		return '0';
	}
	
	public static void main(String[] args) {
		char c1 = findFirstNoRepeatChar("abaccdeff");
		System.out.println(c1);
	}
}

小结:条条大路通罗马

相关题目一:

定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现过的所有字符。例如从第一个字符串“We are students.”中删除在第二个字符串"aeiou"中出现过的字符串得到的结果是"W r Stdnts."。

思路:

我们可以创建一个用数组实现的简单哈希表来存储第二个字符串。这样我们从头到尾扫描第一个字符串的每一个字符时,用O(1)时间就能判断出该字符是不是在第二个字符中。如果第一个字符串的长度是n,那么总的时间复杂度是O(n)。

相关题目二:

定义一个函数,删除字符串中所有重复出现的字符。例如输入"google",删除重复的字符串之后的结果是"gole"。

思路:

我们可以创建一个用布尔型数组实现的简单的哈希表。数组中的元素的意义是其下表看作ASCII码对应的字母在字符串中是否已经出现。我们先把数组中所有的元素都设为false。以google为例,当扫描到第一个g时,g的ASCII码是103,那么我们把数组下标为103的元素设为true,就知道g在前面已经出现了。即我们用O(1)时间就能判断出每个字符是否在前面已经出现过。如果是字符串的长度是n,那么总的时间复杂度是O(n)。

相关题目三:

在英语中,如果两个单词中出现的字母相同,并且每个字母出现的次数也相同,那么这两个单词互为变位词(Anagram)。例如silent与listen、evil与live等互为变位词。完成一个函数,判断输入的两个字符串是不是互为变位词。

思路:

我们可以创建一个用数组实现的简单哈希表,用来统计字符串中每个字符出现的次数。当扫描到第一个字符串中的每个字符时,为哈希表对应的项的值增加1。接下来扫面第二个字符串,扫描到每个字符串时,为哈西边对应的项的值减去1。如果扫描完第二个字符串后,哈希表所有的值都是0,那么这两个字符串就互为变位词。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一个只出现一次的字符(Java) 的相关文章

随机推荐

  • python根据excel时间表统计24小时各小时区间点的个数

    1 首先使用excel中的HOUR 函数 将日期数据 年 月 日 时 分 秒 转换为小时 表格命名为hour xlsx 2 使用python读取excel数据hour xlsx 将小时列转换为列表hour 将列表hour转换为集合myset
  • Java词频统计算法(使用单词树)

    许多英语培训机构 如新东方 都会出几本 高频词汇 的书 主要内容是统计近几年来各类外语考试中屡次出现的高频词汇 帮助考生减少需要背的生词的数量 但这些高频是如何被统计出来的呢 显然不会用手工去计算 假如我们已经将一篇文章存在一字符串 Str
  • EditText的三种监听内容的方式

    editText addTextChangedListener object TextWatcher override fun onTextChanged s CharSequence start Int before Int count
  • 招聘数据采集+Hive数据分析+数据可视化

    1 需求 背景描述 近年来随着IT产业的快速发展 全国各地对IT 类的人才需求数量也在不断 增多 XHS集团 为了明确今后IT产业人才培养方向 在多个省份进行 IT公 司岗位情况调研分析 你所在的小组将承担模拟调研分析的任务 通过在招聘 网
  • 【Apifox Helper】自动生成接口文档,IDEA+Apifox懒人必备

    文章目录 前言 缘由 接口文档对接爽 整理起来真费脑 本文阅读时长 约10分钟 前置条件 1 IDEA开发工具 2 Apifox 不必要 主要目标 一秒生成接口文档 水图 IDEA中项目接结构图 生成到Apifox接口文档图 试用人群 1
  • PowerDesigner15.1如何安装?汉化破解版安装教程(含安装文件、汉化包、破解文件)

    powerdesigner是能进行数据库设计的强大的软件 是一款开发人员常用的数据库建模工具 使用它可以分别从概念数据模型 Conceptual Data Model 和物理数据模型 Physical Data Model 两个层次对数据库
  • glog详解

    glog详解 1 glog的安装与使用 1 下载glog http code google com p google glog downloads detail name glog 0 3 3 tar gz 2 安装glog configu
  • 请用详细列出宝塔搭建Nacos的流程

    好的 为了在宝塔中搭建 Nacos 服务 您需要执行以下步骤 下载 Nacos 的最新版本并解压缩 使用文本编辑器打开 conf application properties 文件 并修改其中的数据库配置 使 Nacos 可以连接到您的数据
  • C++中队列的顺序存储

    队列 引言 示例 开发环境 运行结果 引言 队列先进先出 队头出队 队尾入队 其存储可以分为顺序存储和链式储存 本文记录队列的顺序存储 也就是队列中的元素存储的内存空间是连续的 这里使用数组来模拟线性队列 示例 直接上代码 SeqQueue
  • java arraylist 拷贝_Copy ArrayList的四种方式

    Copy ArrayList的四种方式 简介 ArrayList是我们经常会用到的集合类 有时候我们需要拷贝一个ArrayList 今天向大家介绍拷贝ArrayList常用的四种方式 使用构造函数 ArrayList有个构造函数 可以传入一
  • 第三周课程总结&实验报告一

    实验报告 1 打印输出所有的 水仙花数 所谓 水仙花数 是指一个3位数 其中各位数字立方和等于该数本身 例如 153是一个 水仙花数 实验代码 public class ShuiXianHua public static void main
  • L3-014 周游世界 (30 分)

    题目 题目链接 题解 DFS 采用的数据结构 vector 索引为起点 值为 终点 起点公司编号 当然你也可以保存终点公司编号 但是代码中的语句就需要改一下了 dfs 传入四个信息 当前节点 遇到的节点数 换乘数 当前节点所在公司的编号 由
  • python 的回调函数

    回调函数就是一个通过函数指针调用的函数 如果你把函数的指针 地址 作为参数传递给另一个函数 当这个指针被用来调用其所指向的函数时 我们就说这是回调函数 有些库函数 library function 却要求应用先传给它一个函数 好在合适的时候
  • 指针(一)

    这里写目录标题 一 什么是指针 二 指针和指针类型 三 野指针 四 指针运算 五 指针和数组 六 二级指针 七 指针数组 一 什么是指针 1 指针是内存中一个最小单元的编号 也就是地址 2 平时我们说的指针 通常指的是指针变量 是用来存放地
  • 大数据手册(Spark)--Spark基本概念

    文章目录 Spark 基本概念 Hadoop 生态 Spark 生态 Spark 基本架构 Spark运行基本流程 弹性分布式数据集 RDD Spark安装配置 Spark基本概念 Spark基础知识 PySpark版 Spark机器学习
  • 用户互动优化:微信营销系统实践

    在当今移动互联网时代 微信已经成为企业进行营销的重要平台之一 而用户互动作为营销的关键环节 对于提升品牌影响力 增强用户忠诚度至关重要 本文将深入探讨如何通过微信营销系统实践 优化用户互动 提升营销效果 建立更紧密的用户关系 1 理解用户互
  • 修改本地host文件加入可用ip使谷歌浏览器翻译插件重新生效

    修改本地host文件加入可用ip使谷歌浏览器翻译插件重新生效 第一步 找到host文件 可以使用这个工具进行对Hosts文件进行一个查找 鼠标放到对应路径上面 点击鼠标右键 选择打开路径就到对应 路径了 也可以复制到这个路径下面去找host
  • .NET6-Asp.Net Core webapi -从零开始的webapi项目

    本项目为本人22年毕设项目 后续会不断更新本篇文章 全部内容都会写在这一篇文章里 喜欢的请持续关注 一 如何创建 Asp Net Core webapi 项目 二 如何使用 EntityFrameWorkCore DbFirst 需要用到的
  • 人工智能 ai基础知识_如何使用人工智能改善基础医疗的成果和效率

    人工智能 ai基础知识 Only 7 percent of a message is based on the words it contains The rest 93 percent comes from the speaker s t
  • 第一个只出现一次的字符(Java)

    题目 在字符串中找出第一个只出现一次的字符 如输入 abaccdeff 则输出 b 第一思路 借助于数组来做 开辟一个长度为26的数组 用来存放字符串中每个字符出现的次数 这样第一次扫描去统计这个字符串中字符出现的次数 第二次去统计第一个出