算法(十七)

题目链接: 面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

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

示例 1:

输入: s = "leetcode"
输出: false 

示例 2:

输入: s = "abc"
输出: true

限制:

  • 0 <= len(s) <= 100
  • s[i]仅包含小写字母
  • 如果你不使用额外的数据结构,会很加分。
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;
            }else{
                bitMap|=1<<x;//把当前字符加入到位图中
            }
        }
        return true;
    }
}

题目链接:268. 丢失的数字 - 力扣(LeetCode)

 

给定一个包含 [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 中。

    提示:

    • n == nums.length
    • 1 <= n <= 104
    • 0 <= nums[i] <= n
    • nums 中的所有数字都 独一无二

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

    解法(位运算):

    算法思路:

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

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

    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;
        }
    }

     

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值