【九章斩题录】C/C++:判定字符是否唯一

news2024/12/24 0:04:50

     精品题解 🔥 《九章斩题录》  👈 猛戳订阅


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

✅ 模板:C语言

class Solution {
public:
    bool isUnique(string astr) {

    }
};

💭 思考:《程序员面试金典》里的题,这题和剑指Offer的 "数组中重复的数字" 几乎一模一样啊,只是重复的数字变成了重复的字符,判断 "重复" 和判断 "是否唯一" 在这里实际上是一样的。


「 法一 」暴力大法

💡 思路:用两个 for 暴力,外层 for 依次选定一个锚点,然后内层 for 从锚点下一个位置开始找。找到相同的就说明不是唯一的,我们返回 false。如果循环结束仍然没找到,那就说明字符都是唯一的,返回 true。优点就是简单,但时间复杂度是 O(n^2)

💬 代码演示:

class Solution {
public:
    bool isUnique(string astr) {
        for (int i = 0; i < astr.size(); i++) {
            for (int j = i + 1; j < astr.size(); j++) {
                if (astr[i] == astr[j]) {
                    return false;
                }
            }
        }
        return true;
    }
};

🚩 运行结果如下:

「 法二 」哈希无序集

💡 思路:既然要找是否唯一,很容易想到用哈希,这里可以利用 unordered_set。既然要找重复的元素,本质上就是看是否 unique (唯一),这让我们想到了数学中的集合,可以利用 "集合元素是唯一的" 的特点。拿题目中的例子来说,如果我们以集合的方式存储一遍该字符串,那么如果在存储过程中出现重复,那么不就找到我们想要的 target 了吗?

我们知道,set 的底层是红黑树,时间复杂度为 \color{}O(logN),而 unordered_set 的期望复杂度能够达到 \color{}O(1)。所以这里我们选择使用 unordered_set。

unordered_set 我们仍然是用 count 来检查是否在 hash 表内,用 insert 来插入。

💬 代码演示:

class Solution {
public:
    bool isUnique(string astr) {
        unordered_set<char> u_set;
        for (int i = 0; i < astr.size(); i++) {
            if (u_set.count(astr[i]) == 0) {
                u_set.insert(astr[i]);
            }
            else {
                return false;
            }
        }
        return true;
    }
};

🚩 运行结果如下:

「 法三 」排序 + 遍历

💡 思路:我们可以尝试 "排序 + 遍历" 的方法,先对字符串进行排序,因为排序后,相同的字符肯定是紧挨着的,如此一来,我们只需要一层循环遍历一遍排序完的字符串即可。遍历时将下标 \color{}i 设置从 1 开始,依次和 \color{}i-1 下标的元素做对比即可。排序可以直接调 sort。

💬 代码演示:

class Solution {
public:
    bool isUnique(string astr) {
        sort(astr.begin(), astr.end());
        for (int i = 1; i < astr.size(); i++) {
            if (astr[i - 1] == astr[i]) {
                return false;
            }
        }
        return true;
    }
};

「 法四 」st 数组

💡 思路:在遍历字符串时,使用 st 数组记录当前字符,如果该字符存在则说明该字符不是唯一。

class Solution {
public:
    bool isUnique(string astr) {
        bool st[10000] = { 0 };   // 初始化为0
        for (int i = 0; i < astr.size(); i++) {
            if (st[ astr[i] ] != 0) {   // 如果不为0
                return false;
            }
            st[ astr[i] ] = 1;    // 设置为1
        }
        return true;
    }
};

「 法五 」位运算

💡 思路:题目说不使用额外数据结构加大分,好好好。

class Solution {
public:
    bool isUnique(string astr) {
        int mark = 0;
        int move_bit = 0;
        for (auto e : astr) {
            move_bit = e - 'a';
            if (mark & (1 << move_bit)) {
                return false;
            }
            else {
                mark |= (1 << move_bit);
            }
        }
        return true;
    }
};

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2023.
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

牛客网. 剑指offer 题解 [EB/OL]. []. https://www.nowcoder.com/exam/oj/ta?tpId=13.

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

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

相关文章

typescript错误代码 error TS2451: 无法重新声明块范围变量“age”。ts(2451)

今天心血来潮写ts教程的时候发现一个问题,如下 短短的两行代码,竟然都报错,无法重新声明块范围变量age\。明明与其他文件没有相互依赖&#xff0c;却会提示 [ts] 无法重新声明块范围变量“age”。。且该文件目录夹下&#xff0c;也没有其他文件。为什么会有这个报错呢&#xff…

NZ系列工具NZ03:利用右键进行筛选操作

【分享成果&#xff0c;随喜正能量】生活就是这样&#xff0c;别人看的是结果&#xff0c;而自己撑的却是整个过程。曾经的微笑&#xff0c;是一种心情&#xff0c;现在的微笑&#xff0c;只不过是一种表情。如果情绪不能用言语说出来&#xff0c;那就去吹吹风吧。。 我的教程…

Python爬虫被封ip的解决方案

目录 一、网站反爬虫机制有哪些 二、Python爬虫被封ip的原因 三、爬虫被封IP怎么解决 四、代码示例 在爬虫程序运行过程中&#xff0c;被封禁IP地址是常见的问题之一。这通常是由于目标网站采取了反爬虫机制&#xff0c;例如限制单个IP地址的请求频率或识别请求特征等。当爬…

-60V -40V -100V 30A 50A 100A P管大电流 正极,负极做关断的电路图 解决方案N沟道,P沟道MOSFET开关电路图介绍

P沟道MOS管工作原理以及参数&#xff1f;中广芯源提供原理图纸&#xff0c;估计对需求者有帮助。 P沟道MOS管工作原理&#xff1a;金属氧化物半导体场效应(MOS)晶体管可分为N沟道与P沟道两大类&#xff0c; P沟道硅MOS场效应晶体管在N型启衡旅硅衬底悄凳上有两个P区&#xff0…

【80天学习完《深入理解计算机系统》】第十五天 4.1 Y86-64指令集与Verilog HDL

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

【GNN 03】PyG

工具包安装&#xff1a; 不要pip安装 https://github.com/pyg-team/pytorch_geometrichttps://github.com/pyg-team/pytorch_geometric import torch import networkx as nx import matplotlib.pyplot as pltdef visualize_graph(G, color):plt.figure(figsize(7, 7))plt.xtic…

10分钟学会Hive之用户自定义函数UTF开发

1. 用户自定义函数概述 用户自定义函数简称UDF&#xff0c;源自于英文user-defined function。自定义函数总共有3类&#xff0c;是根据函数输入输出的行数来区分的&#xff0c;分别是&#xff1a; UDF&#xff08;User-Defined-Function&#xff09;普通函数&#xff…

Excel 公式函数:学习基本示例

数据准备 对于本教程&#xff0c;我们将使用以下数据集。 家居用品预算 S / N项目数量价格小计价格适中吗&#xff1f;1芒果96002橘子312003番茄125004食用油565005汤力水133900 房屋建筑项目时间表 S/NITEM开始日期结束日期持续时间&#xff08;天&#xff09;1调查土地0…

C++项目实战——基于多设计模式下的同步异步日志系统-⑧-日志落地类设计

文章目录 专栏导读抽象基类StdoutSink类设计FileSink类设计RollBySizeSink类设计日志落地工厂类设计日志落地类整理日志落地拓展测试RollByTimeSink类设计测试代码测试完整代码 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领…

React框架下如何集成H.265网页流媒体视频播放器EasyPlayer.js?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

Segment Anything Model(SAM)论文解读

一、引言 在这项工作中&#xff0c;作者的目标是建立一个图像分割的基础模型。也就是说&#xff0c;寻求开发一个提示模型&#xff0c;并使用一个能够实现强大泛化的任务在广泛的数据集上对其进行预训练。有了这个模型&#xff0c;使用即时工程解决新数据分布上的一系列下游分…

《C++ primer plus》精炼(OOP部分)——对象和类(3)

学习是人类的天性&#xff0c;持续学习是人类的本能。 文章目录 抽象数据类型&#xff08;ADT&#xff09;--------------------------第11章&#xff1a;使用类--------------------------运算符重载运算符重载限制 抽象数据类型&#xff08;ADT&#xff09; 类的思想很适合用…

狼的传说小游戏

欢迎来到程序小院 狼的传说 玩法&#xff1a; 鼠标左键选择能防御、战斧、风暴3%、滚石10%、藤曼5%、冰柱5%、飞跃10%、三叶草20%、钢叉15%&#xff0c;消灭所有敌人&#xff0c;不同关卡不同敌人&#xff0c;快去闯关消灭敌人吧^^。开始游戏https://www.ormcc.com/play/gameS…

Redis 事务 - 监控测试

Redis 基本事务操作 Redis事务本质&#xff1a;一组命令的集合&#xff01;一个事务中的所有命令都会被序列化&#xff0c;在事务执行过程的中&#xff0c;会按照顺序执行&#xff01; Redis事务是一组Redis命令的有序集合&#xff0c;这些命令在事务中按照顺序执行&#xff0…

昆明草海隧道湿地公园,荻花盛开,又一个网红打卡地

昆明&#xff0c;这座美丽的城市&#xff0c;总是带给人们无尽的惊喜。其中&#xff0c;草海隧道湿地公园更是备受游客青睐。而如今&#xff0c;这里已经成为了一处网红打卡地&#xff0c;吸引了无数游客前来观赏。 一、网红打卡地&#xff0c;草海隧道湿地公园草海隧道湿地公园…

【IEEE会议征稿】第三届电子信息工程与计算机技术国际学术会议(EIECT 2023)

第三届电子信息工程与计算机技术国际学术会议&#xff08;EIECT 2023&#xff09; 2023 3rd International Conference on Electronic Information Engineering and Computer Technology 随着科学技术的高速发展&#xff0c;计算机技术革新日新月异&#xff0c;其智能化、网络…

三分钟教会你快速使用SpringBoot整合第三方登录

前言 在我们生活中无时无刻都在使用第三方登录&#xff0c;如QQ登录、微信登录等&#xff0c;今天教你如何快速使用springboot整合第三方登录&#xff0c;下面教程以Gitee为例 1. 我们借助JustAuth组件来完成第三方登录 Justauth官网&#xff1a;https://www.justauth.cn/ …

数据在内存中的存储——练习3

题目&#xff1a; 3.1 #include <stdio.h> int main() {char a -128;printf("%u\n",a);return 0; }3.2 #include <stdio.h> int main() {char a 128;printf("%u\n",a);return 0; }思路分析&#xff1a; 首先二者极其相似%u是无符号格式进行…

Callable 和 FutureTask 带返回值线程使用和源码分析

Callable 和 FutureTask 可以创建带返回值的线程&#xff0c;那它是怎么实现的呢&#xff1f;笔者下面分析&#xff0c;先看看它是怎么使用的 1、Callable FutureTask使用 新建 Name类&#xff0c;实现 Callable 接口&#xff0c;返回 String 类型值 package com.wsjzzcbq.ja…

骨传导耳机危害有哪些?值得入手吗?

事实上&#xff0c;只要是正常使用&#xff0c;骨传导耳机并不会对身体造成伤害&#xff0c;并且在众多耳机种类中&#xff0c;骨传导耳机可以说是相对健康的一种耳机&#xff0c;这种耳机最独特的地方便是声波不经过外耳道和鼓膜&#xff0c; 而是直接将人体骨骼结构作为传声介…