【优选算法】(第十七篇)

目录

判断字符是否唯⼀(easy)

题目解析

讲解算法原理

编写代码

丢失的数字(easy)

题目解析

讲解算法原理

编写代码


判断字符是否唯⼀(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

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

⽰例1:

输⼊:s="leetcode"

输出:false

⽰例2:

输⼊:s="abc"

输出:true

限制:

0<=len(s)<=100

s[i]仅包含⼩写字⺟

如果你不使⽤额外的数据结构,会很加分。

讲解算法原理

解法(位图的思想):

算法思路:

利⽤「位图」的思想,每⼀个「⽐特位」代表⼀个「字符,⼀个 int 类型的变量的 32 位⾜够表⽰所有的⼩写字⺟。⽐特位⾥⾯如果是 0 ,表⽰这个字符没有出现过。⽐特位⾥⾯的值是 1 ,表⽰该字符出现过。

那么我们就可以⽤⼀个「整数」来充当「哈希表」。

编写代码

c++算法代码:

复制代码
class Solution
{
public:
 bool isUnique(string astr) 
 {
 // 利⽤鸽巢原理来做的优化
 if(astr.size() > 26) return false; 
 int bitMap = 0;
 for(auto ch : astr)
 {
 int i = ch - 'a';
 // 先判断字符是否已经出现过
 if(((bitMap >> i) & 1) == 1) return false;
 // 把当前字符加⼊到位图中
 bitMap |= 1 << i;
 }
 return true;
 }
};

java算法代码:

复制代码
class Solution {
 public boolean isUnique(String astr) {
 // 利⽤鸽巢原理来做优化
 if(astr.length() > 26) return false;
 int bitMap = 0;
 for(int i = 0; i < astr.length(); i++)
 {
 int x = astr.charAt(i) - 'a';
 // 先判断字符是否在位图中
 if(((bitMap >> x) & 1) == 1) return false;
 // 把当前字符加⼊到位图中
 bitMap |= 1 << x;
 }
 return true;
 }
}

丢失的数字(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给定⼀个包含[0,n]中n个数的数组nums,找出[0,n]这个范围内没有出现在数组中的那个数。

⽰例1:

输⼊:nums=[3,0,1]输出:2

解释:n=3,因为有3个数字,所以所有的数字都在范围[0,3]内。2是丢失的数字,因为它没有出现在nums中。

⽰例2:

输⼊:nums=[0,1]

输出:2

解释:n=2,因为有2个数字,所以所有的数字都在范围[0,2]内。2是丢失的数字,因为它没有出现在nums中。

⽰例3:

输⼊:nums=[9,6,4,2,3,5,7,0,1]输出:8

解释:n=9,因为有9个数字,所以所有的数字都在范围[0,9]内。8是丢失的数字,因为它没有出现在nums中。

⽰例4:

输⼊:nums=[0]

输出:1

解释:n=1,因为有1个数字,所以所有的数字都在范围[0,1]内。1是丢失的数字,因为它没有出现在nums中。

提⽰:

n==nums.length

1<=n<=10^4

0<=nums[i]<=n

nums中的所有数字都独⼀⽆⼆

进阶:你能否实现线性时间复杂度、仅使⽤额外常数空间的算法解决此问题?

讲解算法原理

解法(位运算)

算法思路:

设数组的⼤⼩为 n ,那么缺失之前的数就是 [0, n] ,数组中是在 [0, n] 中缺失⼀个数形成的序列。

如果我们把数组中的所有数,以及 [0, n] 中的所有数全部「异或」在⼀起,那么根据「异或」运算的「消消乐」规律,最终的异或结果应该就是缺失的数~

编写代码

c++算法代码:

复制代码
class Solution
{
public:
 int missingNumber(vector<int>& nums) 
 {
 int ret = 0;
 for(auto x : nums) ret ^= x;
 for(int i = 0; i <= nums.size(); i++) ret ^= i;
 return ret;
 }
};

java算法代码:

复制代码
class Solution {
 public int missingNumber(int[] nums) {
 int ret = 0;
 for(int x : nums) ret ^= x;
 for(int i = 0; i <= nums.length; i++) ret ^= i;
 return ret;
 }
}
相关推荐
AI科技星几秒前
张祥前统一场论中两个电荷定义的统一性解析
开发语言·线性代数·算法·数学建模·平面
代码地平线1 分钟前
C语言实现堆与堆排序详解:从零手写到TopK算法及时间复杂度证明
c语言·开发语言·算法
小江的记录本1 分钟前
【大语言模型】大语言模型——核心概念(预训练、SFT监督微调、RLHF/RLAIF对齐、Token、Embedding、上下文窗口)
java·人工智能·后端·python·算法·语言模型·自然语言处理
炘爚3 分钟前
LeetCode(两两交换链表中的节点)
算法·leetcode·链表
wsoz3 分钟前
Leetcode矩阵-day7
c++·算法·leetcode·矩阵
念越3 分钟前
算法每日一题 Day01|双指针解决移动零问题
java·算法·力扣
敖正炀4 分钟前
StampedLock 详解
java·后端
AllData公司负责人4 分钟前
AllData数据中台集成开源项目Apache Doris建设实时数仓平台
java·大数据·数据库·数据仓库·apache doris·实时数仓平台·doris集群
白宇横流学长4 分钟前
助农产品在线交易平台设计与实现【源码+文档】
java
不想看见4044 分钟前
Merge k Sorted Lists 优先队列--力扣101算法题解笔记
笔记·算法·leetcode