题目:

实现一个算法,确定一个字符串 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 的所有字符是否全都不同(两种方法)相关推荐

  1. excel单元格内容拆分_Excel中把一个单元格内容拆分到多个单元格内的两种方法...

    ​利用时间是一个极其高级的规律.--恩格斯 今天给大家分享的是关于数据拆分的小技巧,什么意思呢? 就比如下面的表格,我想把图一的表转换为图二的表,这个要如何做呢? 今天给大家分享2种方法实现它. 方法 ...

  2. 批量替换字符串,将其中的数字递增(两种方法)和circlr.js插件的使用

    使用circlr.js插件实现3D效果的时候,不想在JS中写追加,直接写html又太麻烦(使用的是HBuilder X),所以找到了两种批量替换字符串,将其中的数字递增的方法. 想要实现的效果: 1. ...

  3. js 判断字符串为空和不为空(两种方法)

    1 判断字符串为空 (1)第一种方法 var test=""; if(test==""||test==null||test==undefined){alert( ...

  4. 算法014:判定字符串中字符是否唯一:实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

    题目:判定字符是否唯一:实现一个算法,确定一个字符串 s 的所有字符是否全都不同.示例 1:输入: s = "leetcode"输出: false示例 2:输入: s = &quo ...

  5. 实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

    1.实现一个算法,确定一个字符串 s 的所有字符是否全都不同. 思路:就是让字符串中的每一个字符与别的字符相互比较 方法1:循环套循环按个字符去比较 方法2:先定义个集合,把每个字符放到集合中,(如果 ...

  6. 回文指的是一个字符串从前面读和从后面读都一样,编写一个算法判断一个字符串是否为回文。

    回文指的是一个字符串从前面读和从后面读都一样,编写一个算法判断一个字符串是否为回文. 要求: 1)采用链栈实现算法: 2)从键盘输入一个字符串,输出判断结果. 算法思路: 根据栈的后进先出的特点,编写 ...

  7. 算法题:一个圆环上有100个灯泡,灯泡有打开关闭两种状态,灯泡状态随机。设计算法,使灯泡都亮。

    算法题:一个圆环上有100个灯泡,灯泡有打开关闭两种状态,灯泡状态随机,按一个灯泡,相邻两个灯泡的状态也会改变. eg: ' 暗 - 亮 - 暗 ' 按中间灯泡 ,变化为 ' 亮 - 暗 - 亮 '. ...

  8. 写一个rtrim()函数消除字符串后面的空格字符。编main函数调用测试它。

    写一个rtrim()函数消除字符串后面的空格字符.编main函数调用测试它. **提示信息:"请输入一个字符串:" **输出格式要求:"去掉右边的空格后为%s!\n&qu ...

  9. 判断一个字符串是否为数字字符串(两种方法)

    第一种方法: //正则表达式判断是否是数字字符串(可判断正数,负数和小数)public boolean isNumberString(String str) {java.util.regex.Patt ...

最新文章

  1. 服务器和普通用户电脑的区别
  2. SpringCloud-使用路由网关统一访问接口(附代码下载)
  3. nature machine intelligence
  4. python数字编码_Python 编码为什么那么蛋疼?
  5. 使用分页插件PageHelper
  6. OpenGL程序管道,可分离程序和着色器子例程的基本用法
  7. MFC对话框自适应大小(四舍五入)高精度版本
  8. oracle类似sqlcmd工具,Oracle:是否有跟踪查询的工具,例如用于SQL Server的Profiler?...
  9. spark学习-34-Spark的BroadcastManager广播管理器
  10. 每天生成 45 亿字符的 GPT-3,真能取代人工?
  11. 信息系统项目管理师——进度管理论文
  12. 一文搞懂SPI通信协议
  13. northwind数据库介绍
  14. 教你认识正斜杠(/)与反斜杠(\)
  15. java实现mysql拦截_在mybatis执行SQL语句之前进行拦击处理实例
  16. Contest1389 - 2018年第三阶段个人训练赛第四场. 售票(strncmp)
  17. python常用的几个库_盘点Python常用的20个库
  18. STM32使用的相关知识点
  19. 认知服务调用如何使用图片的DataURL
  20. 高德地图 java_几行代码实现高德地图的高级用法

热门文章

  1. oracle 常见游标,Oracle常见游标使用
  2. java公告_[公告]java起步篇
  3. Flutter高仿微信-第2篇-登录
  4. mysql数据库设计实现工作流_工作流数据库字段设计-审批流程。。
  5. 百度地图划分区域进行网格化
  6. 如何下载安徽省卫星地图高清版大图
  7. 淘宝众筹数据爬取(2)
  8. 计算某月某日某时是一年里(设计典型年)的第几个小时的Python程序
  9. 1.2.2芯片完整产业链
  10. flutter 动画json_Flutter 中的 JSON 解析