实现一个算法,确定一个字符串 s 的所有字符是否全都不同(两种方法)
题目:
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = “leetcode”
输出: false
示例 2:
输入: s = “abc”
输出: true限制:
0 <= len(s) <= 100
如果你不使用额外的数据结构,会很加分。
一、双循环牺牲时间
不使用额外的数据结构,所以计数的方法不能用。
这种情况来说,容易想到的就是牺牲时间换空间,第一种方法就是用双循环来代替额外的数据结构。
内外循环都遍历整个字符串,然后对比是否除了自身之外还有别的位置是一样的字符。
class Solution {public boolean isUnique(String astr) {if(astr.length()==0||astr.length()==1){return true;}for(int i=0;i<astr.length();i++){for(int j=0;j<astr.length()&&j!=i;j++){if(astr.charAt(i)==astr.charAt(j)){return false;}}}return true;}
}
二、二进制数作哈希表
额外的空间不可使用?能不能有替代方案。
来看看这种做法,最近做了比较多的题都是在用位运算,然后就看到了这一种非常妙的做法。
我们先来复习一下位运算。
然后,我们想一个问题,由于 ASCII 码字符个数为 128 个。(注意,扩展的 ASCII 不是128个字符,有256个),并不多,如果用额外数组存储显然是不符合要求了。
但是,可以使用 两个 64 位的 long 变量 来存储是否出现某个字符,他们对应的二进制位 1 表示出现过,0 表示未出现过。
128个字符,每个字符都对应的是一个唯一的数字,我们可以直接转为二进制, long 类型长度为 64 个二进制位,所以用两个数字。
每个字符按照对应的 ASCII 码值,可以分为 >= 64 (64~127) 和 <64 (0~63),记码值为 c ,则 ,0 <= c < 128。
- 那么 c 可以对应 long 数字的某一个位,我们只需要将这一位,置为 1 就可以,具体的做法,就是将 1 左移 c 次;
- 在把对应位置置 1 之前判断,这一位是不是已经是 1 了?是的话就说明重复了,直接可以 return false。
class Solution {public boolean isUnique(String astr) {long low64 = 0;long high64 = 0;for (char c : astr.toCharArray()) {if (c >= 64) {long bitIndex = 1L << (c-64);//如果>=64,先统一左移64位if ((high64 & bitIndex) != 0) {return false;//如果这一位已经是 1 ,那么进行与操作得到结果不是 0}high64 |= bitIndex;//进行或运算,结果是把对应位置为 1} else {long bitIndex = 1L << c;if ((low64 & bitIndex) != 0) {return false;}low64 |= bitIndex;}}return true;}
}
实现一个算法,确定一个字符串 s 的所有字符是否全都不同(两种方法)相关推荐
- excel单元格内容拆分_Excel中把一个单元格内容拆分到多个单元格内的两种方法...
利用时间是一个极其高级的规律.--恩格斯 今天给大家分享的是关于数据拆分的小技巧,什么意思呢? 就比如下面的表格,我想把图一的表转换为图二的表,这个要如何做呢? 今天给大家分享2种方法实现它. 方法 ...
- 批量替换字符串,将其中的数字递增(两种方法)和circlr.js插件的使用
使用circlr.js插件实现3D效果的时候,不想在JS中写追加,直接写html又太麻烦(使用的是HBuilder X),所以找到了两种批量替换字符串,将其中的数字递增的方法. 想要实现的效果: 1. ...
- js 判断字符串为空和不为空(两种方法)
1 判断字符串为空 (1)第一种方法 var test=""; if(test==""||test==null||test==undefined){alert( ...
- 算法014:判定字符串中字符是否唯一:实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
题目:判定字符是否唯一:实现一个算法,确定一个字符串 s 的所有字符是否全都不同.示例 1:输入: s = "leetcode"输出: false示例 2:输入: s = &quo ...
- 实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
1.实现一个算法,确定一个字符串 s 的所有字符是否全都不同. 思路:就是让字符串中的每一个字符与别的字符相互比较 方法1:循环套循环按个字符去比较 方法2:先定义个集合,把每个字符放到集合中,(如果 ...
- 回文指的是一个字符串从前面读和从后面读都一样,编写一个算法判断一个字符串是否为回文。
回文指的是一个字符串从前面读和从后面读都一样,编写一个算法判断一个字符串是否为回文. 要求: 1)采用链栈实现算法: 2)从键盘输入一个字符串,输出判断结果. 算法思路: 根据栈的后进先出的特点,编写 ...
- 算法题:一个圆环上有100个灯泡,灯泡有打开关闭两种状态,灯泡状态随机。设计算法,使灯泡都亮。
算法题:一个圆环上有100个灯泡,灯泡有打开关闭两种状态,灯泡状态随机,按一个灯泡,相邻两个灯泡的状态也会改变. eg: ' 暗 - 亮 - 暗 ' 按中间灯泡 ,变化为 ' 亮 - 暗 - 亮 '. ...
- 写一个rtrim()函数消除字符串后面的空格字符。编main函数调用测试它。
写一个rtrim()函数消除字符串后面的空格字符.编main函数调用测试它. **提示信息:"请输入一个字符串:" **输出格式要求:"去掉右边的空格后为%s!\n&qu ...
- 判断一个字符串是否为数字字符串(两种方法)
第一种方法: //正则表达式判断是否是数字字符串(可判断正数,负数和小数)public boolean isNumberString(String str) {java.util.regex.Patt ...
最新文章
- BLE Mesh(1)—— 简述
- java如何改注释_关于Java:更改字符串值的注释
- raid ahci模式哪个好_比群晖好用?威联通TR-004磁盘阵列外接盒使用详解
- K-近邻算法(KNN)概述
- jQuery基础 - 常用基本属性
- 《编程之美》蚂蚁爬杆问题的扩展【1】
- 深度学习入门有多难?这篇带你零基础入行
- 华为设备ERPS配置命令
- 怎么隐藏电脑桌面计算机,怎么隐藏电脑桌面软件
- CIH病毒的分析与清除
- gg修改器偏移量修改_GG修改器正版
- cocos2dx检测及预防外挂加速
- AFX_VIRTUAL
- 镜子--天空16度蓝
- Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程
- RISC-V为中国MCU企业打开一个新窗口!
- java 占位符写法_java中占位符
- PRA10.3 平台 API 接口调用
- GitFlow 代码管理模型实战
- 白杨SEO:做个世界杯公众号怎么样?以2022年卡塔尔世界杯来做微信搜一搜的SEO流量实战举例