面试题 01.01. 判定字符是否唯一(优质解法)

news2025/1/17 6:17:31

链接:面试题 01.01. 判定字符是否唯一

代码:

class Solution {
    public boolean isUnique(String astr) {
        //s[i]仅包含小写字母,数据范围小于 32 位,我们可以使用 int 变量的比特位来代替数组
        // 每个小写字符对应 bitMap 中的一个比特位,如 a 对应下标为 0 的比特位
        int bitMap=0;
        
        for(int i=0;i<astr.length();i++){
            int offset=astr.charAt(i)-'a';
            //检查之前是否有过 charStr[i] 字符,检查该偏移量下的比特位是否为1
            if(((bitMap>>offset)&1)==1){
                return false;
            }
            //之前没有该字符,添加该字符
            bitMap=bitMap|(1<<offset);
        }

        return true;
    }
}

题解:

        本题属于很简单的一道题,有很多的解题方法,这里介绍一种不是太普遍的方法,通过位运算来解决该问题

        首先我们要注意到一个条件, s[i] 仅包含小写字母,也就是说字符串的组成只有 26 位小写字符,而一个 int 类型的变量的二进制位有 32 位,所以用一个二进制位来代表字符之前是否出现过是绰绰有余的

        用 0 下标的二进制位代表 a,1 下标的代表 b ,以此类推

        通过遍历获取到字符串中的一个字符后,要判断该字符之前是否出现过,即判断该字符所对应的二进制位是否为 1 ,比如现在得到了一个字符 b ,前四个二进制位为 0110 ,首先用字符 b - a 得到偏移量 1,让二进制位向右偏移 1 位,二进制位为 0011 此时 b 字符对应的二进制位移到了第一位,让 0011 & 1,得 1,代表 b 字符对应的二进制位为 1,说明之前 b 字符就存在于字符串中了,返回 false

0        0        1        1

&

0        0        0        1

=

0        0        0        1

        如果前四个二进制位为 0101 b 字符对应的二进制位为 0 ,代表之前 b 字符没有出现过,现在就要将 b 字符对应的二进制位改为 1,偏移量 offset = b - a = 1,0101 | 0010 = 0111 ,此时除了 b 字符对应的二进制位变为 1 ,其余的二进制位都没有改变,而 0010 可以由 1 << offset 得到

        以上便是通过位运算来解决该问题的核心内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1331440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chatgpt如何共享可以防止封号!

ChatGPT 是一个基于 GPT-3.5/GPT-4 模型的对话系统&#xff0c;它主要用于处理自然语言对话。通过训练模型来模拟人类的语言行为&#xff0c;ChatGPT 可以通过文本交流与用户互动。每个新版本的 GPT 通常都会在模型规模、性能和其他方面有一些改进。在目前免费版GPT-3.5 中&…

【AI】Langchain-Chatchat搭建本地知识库-未完,先记录踩的坑

事先说一下&#xff0c;我本地的显卡4070只有12G显存&#xff0c;无法运行本地知识库&#xff0c;我把自己折腾的过程和遇到的坑先记录一下吧&#xff0c;后续如果有算力的话就再跑一遍试试。 Langchain-Chatchat曾用名Langchain-ChatGLM&#xff0c;是智谱AI的本地知识库项目&…

Qt前端技术:5.QSS

这个是表示QFrame中的pushButton中的子类和它子类的子类都将背景变为red 写成大于的时候表示只有直接的子类对象才会变 这个图中的QGroupBox和QPushButton都是QFrame的直接的子类 这个中的QGroupBox是QFrame的直接的子类但是QPushButton 是QGroupBox的子类&#xff0c;QPushB…

如何要做好年终绩效

年终绩效&#xff0c;每年12月份&#xff0c; 都是“绩效”这个词比较热门的阶段&#xff0c; 各个企业各个部门避不开的话题。 那如何能做好呢&#xff0c;一起来看看关于 要做好年终绩效考核、绩效面谈和绩效环评的建议吧&#xff01; 明确目标和指标&#xff1a;在考核开…

Tomcat远程调试

windows环境 写一个 startup-debug.bat&#xff0c;指定tomcat的根目录&#xff0c;端口自己定义 rem *******设置Tomcat目录*******-- set CATALINE_HOMED:\asd\A8-2\tomcat d: rem 8787为可用端口,为远程调试监听端口-- cd %CATALINE_HOME%/bin set JPDA_ADDRESS8787 set J…

JavaScript系列-函数调用之apply、call、bind

文章目录 适用场景apply定义语法具体的例子 call定义语法例子 bind定义例子语法多级绑定 小结更多内容 适用场景 apply、call、bind 三者都是 Function 原型上的方法&#xff0c;也就是说&#xff0c;基本所有函数都可以通过 函数名.apply|call|bind 调用 apply、call、bind …

centos7服务器安装 mysql

centos7服务器安装 mysql 一、下载 官网&#xff1a;https://dev.mysql.com/downloads/mysql/ 二、安装 1.查看有没有需要卸载的SQL包&#xff0c;一般系统的mariadb是自带的&#xff0c;需要卸载 rpm -qa | grep mysql rpm -qa | grep mariadb例如&#xff1a;安装过MySQL…

内存函数的学习

额外知识点 第一个 假设c为int类型&#xff0c;&#xff08;char&#xff09;c之后&#xff0c;之后如果还用变量c的话&#xff0c;c依然为int类型。&#xff08;&#xff09;强制转换操作符并不会永久改变原本的变量类型。 第二个 \0在打印时不会显示出来 第三个 void …

零成本搭建一款博客网站(基于Vercel+Hexo完美实现)【保姆级教程】

文章目录 &#x1f438;基于VercelHexo零成本搭建博客网站&#x1f43b;实现思路 &#x1f42e;Hexo的配置与安装&#x1f412;Hexo的美化与使用&#x1f42b;Github的推送与部署&#x1f43c;Vercel部署与网站上线&#x1f41b;总结 &#x1f438;基于VercelHexo零成本搭建博客…

Vue 实现响应式布局

实现响应式布局是工作中必不可少 客户需要 若是使用vue element ui 的方式实现 浏览器宽度为760的情况 浏览器宽度为360的情况 手机上的显示的情况 一、对于屏幕尺寸的定义 element UI参照Bootstrap的解决方案提供了五种屏幕大小尺寸&#xff1a;xs、sm、md、lg 和 xl。并对…

帮助谷歌从40人裂变为60000人的OKR是啥?

OKR&#xff08;Objectives and Key Results&#xff09;是一种目标管理方法&#xff0c;旨在帮助组织和个人明确目标并衡量成功。在谷歌的发展过程中&#xff0c;OKR扮演了至关重要的角色&#xff0c;帮助公司从40人规模快速成长为60000人的科技巨头。 OKR适用于各种类型的企…

Spring中你应该要知道的initMethod

文章目录 功能源码 功能 之前的文章中由解析过PostConstruct/PreDestroy&#xff0c;他们也是initMethod的一种形式&#xff0c;注解方式是后来才加入的&#xff0c;在源码中他们的命名都是一样的名字&#xff0c;都叫initMethod&#xff0c;不过他们却是有着很大的差别&#…

MySQL数据库基础和基本的增删改查操作

目录 前瞻 数据库的基本概念 数据库管理系统&#xff08;DBMS&#xff09; 数据库系统(DBS) 数据库类型和常用数据库 关系型数据库 SQL 非关系型数据库 NoSQL SQL语句 简介 SQL语句分类 常用的数据类型 MySQL的六大约束特性 SQL语句的使用 创建及删除数据库和表 …

quic协议及核心源码分析

quic协议 1、网络通信时&#xff0c;为了确保数据不丢包&#xff0c;早在几十年前就发明了tcp协议&#xff01;然而此一时非彼一时&#xff0c;随着技术进步和业务需求增多&#xff0c;tcp也暴露了部分比较明显的缺陷&#xff0c;比如: 建立连接的3次握手延迟大&#xff1b; T…

亚信安慧AntDB数据库荣获“2023年度信创卓越贡献奖”

近日&#xff0c;业界知名IT垂直门户媒体IT168公布“2023技术卓越奖”获奖名单&#xff0c;亚信安慧AntDB数据库荣获“2023年度信创卓越贡献奖”。 图1&#xff1a;亚信安慧AntDB数据库荣获“2023年度信创卓越贡献奖” “技术卓越奖”评选是IT168重要的年度奖项评选&#xff0c…

【Filament】纹理贴图

1 前言 本文主要介绍使用 Filament 实现纹理贴图&#xff0c;读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形绘制立方体 Filament 纹理坐标的 x、y 轴正方向分别朝右和朝上&#xff0c;其 y 轴正方向朝向与 OpenGL ES…

使用StableDiffusion进行图片Inpainting原理

论文链接&#xff1a;RePaint: Inpainting using Denoising Diffusion Probabilistic Models代码链接&#xff1a;RePaint Inpainting任务是指在任意一个二进制的掩码指定的图片区域上重新生成新的内容&#xff0c;且新生成的内容需要和周围内容保持协调。当前SOTA模型用单一类…

天文与计算机:技术的星辰大海

天文与计算机&#xff1a;技术的星辰大海 一、引言 在人类的历史长河中&#xff0c;天文学与计算机技术这两个领域似乎相隔甚远&#xff0c;然而在科技的推动下&#xff0c;它们却逐渐走到了一起&#xff0c;为人类对宇宙的探索开辟了新的道路。天文观测的复杂度与数据量随着…

C++初阶——类和对象

呀哈喽&#xff0c;我是结衣 C入门之后&#xff0c;我们就进入了C的初阶的学习了&#xff0c;在了解类和对象之前&#xff0c;我们还是先了解&#xff0c;面向过程和面向对象的初步认识。 在本篇博客中&#xff0c;我们要讲的内容有 1.面向过程和面向对象初步认识 2.类的引入 3…

数据流图_DFD图_精简易上手

数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输人移动到输出的过程中所经受的变换。 首先给出一个数据流图样例 基本的四种图形 直角矩形:代表源点或终点,一般来说,是人,如例图的仓库管理员和采购员圆形(也可以画成圆角矩形):是处理,一般来说,是动作,是动词名词的形式…