题目:

实现一个算法,确定一个字符串 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. BLE Mesh(1)—— 简述
  2. java如何改注释_关于Java:更改字符串值的注释
  3. raid ahci模式哪个好_比群晖好用?威联通TR-004磁盘阵列外接盒使用详解
  4. K-近邻算法(KNN)概述
  5. jQuery基础 - 常用基本属性
  6. 《编程之美》蚂蚁爬杆问题的扩展【1】
  7. 深度学习入门有多难?这篇带你零基础入行
  8. 华为设备ERPS配置命令
  9. 怎么隐藏电脑桌面计算机,怎么隐藏电脑桌面软件
  10. CIH病毒的分析与清除
  11. gg修改器偏移量修改_GG修改器正版
  12. cocos2dx检测及预防外挂加速
  13. AFX_VIRTUAL
  14. 镜子--天空16度蓝
  15. Python之 - 使用Scrapy建立一个网站抓取器,网站爬取Scrapy爬虫教程
  16. RISC-V为中国MCU企业打开一个新窗口!
  17. java 占位符写法_java中占位符
  18. PRA10.3 平台 API 接口调用
  19. GitFlow 代码管理模型实战
  20. 白杨SEO:做个世界杯公众号怎么样?以2022年卡塔尔世界杯来做微信搜一搜的SEO流量实战举例

热门文章

  1. java jdbcrdd_鸡肋的JdbcRDD
  2. html锚链接设为无效,使用jQuery使HTML锚链接(HyperLink)不可点击或禁用
  3. 史上最详细的PMP备考总结请注意查收!
  4. NLP基础--文本特征提取中文分词word2vec原理
  5. html时钟翻牌效果,flipTimer – jQuery时钟翻牌效果插件
  6. 【考试经验】厚积薄发——托福50到97之路
  7. 无线模块超远距离传输中实现中继的方法
  8. [NOIP2017模拟]杆子的排列
  9. CentOS软件管理 - 编译安装
  10. 千里走单骑:08-北京到上海骑记--Day7.赛风雨