缺失的数字三种解法(不包括hash表法。。)

题目

在这里插入图片描述

本题我不使用hash表法。。因为hash表实在是太没技术含量了。。

解法一:强行排序双指针


class Solution {
public:
    int missingNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int n = nums.size();
        int l = 0,r = nums.size()-1;
        int res = 0;
        //排除两个缺失数字在最左和最右的特殊情况。
        if(nums[n-1]!=n)return n;
        if(nums[0]!=0)return 0;
        //当排序后的两个相邻的数字相差超过1,则得出答案。。
        while(l<r){
            if(l+1<r&&(nums[l+1]-nums[l])==1)
                l++;
            else {res = nums[l]+1;break;}
            if(r-1>l&&(nums[r]-nums[r-1])==1)
                r--;
            else{res = nums[r]-1;break;}
        }
        return res;
        
    }
};

解法二:数学求和公式法

很明显的等差数列求和。。
sum = (0+n)*n+1/2.(首项+末项)x项数/2

class Solution {
public:
    int missingNumber(vector<int>& nums) {
       int n = nums.size();
       long long sum = n*(n+1)/2;
       for(int i=0;i<n;i++){
           sum -= nums[i];
       }
        return sum;
        
    }
};

解法三:位运算

这次位运算并不是大爹–还是O(n)的复杂度。
具体思路:由于本身是0~n的数字都只出现了一次,我们现在将其中一数字缺失,如果并未缺失我们对0到n序列和0到n序列进行异或运算,则最终结果肯定是0,若我们中只缺失了那一个,则结果便会是那个数字了。

代码

class Solution {
public:
    int missingNumber(vector<int>& nums) {
       int n = nums.size();
       int res = 0;
       for(int i=0;i<n;i++){
           //相当于实现0^0...n^0...n,但少了n所以最后再补上。
           res ^= nums[i]^i;
       }
        return res^n;
        
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
哈希表是一种数据结构,用于实现字典或映射。哈希表使用哈希函数将键映射到存储桶中,以便快速查找值。链地址法是哈希表的一种实现方式,它使用链表来解决哈希冲突的问题。下面是使用链地址法实现哈希表的C语言代码示例: 首先,定义一个哈希表节点的结构体: ``` typedef struct HashNode{ int key; int value; struct HashNode* next; }HashNode; ``` 哈希表节点包含键值对和一个指向下一个节点的指针。 接着,定义一个哈希表的结构体: ``` typedef struct HashTable{ int size; HashNode** table; }HashTable; ``` 哈希表包含一个大小和一个指向指针数组的指针。 接下来,实现哈希函数,将键映射到存储桶中: ``` int hash(int key, int size){ return key % size; } ``` 这里使用取模运算将键映射到存储桶中。 然后,实现哈希表的初始化函数: ``` HashTable* createHashTable(int size){ HashTable* ht = (HashTable*)malloc(sizeof(HashTable)); ht->size = size; ht->table = (HashNode**)malloc(sizeof(HashNode*) * size); for(int i = 0; i < size; i++){ ht->table[i] = NULL; } return ht; } ``` 这里使用malloc动态分配哈希表和指针数组的内存空间,并将指针数组中的元素初始化为NULL。 接下来,实现插入操作: ``` void insert(HashTable* ht, int key, int value){ int index = hash(key, ht->size); HashNode* node = (HashNode*)malloc(sizeof(HashNode)); node->key = key; node->value = value; node->next = ht->table[index]; ht->table[index] = node; } ``` 这里首先使用哈希函数计算键的索引,然后创建一个新的哈希节点并将其插入到链表的头部。 最后,实现查找操作: ``` int search(HashTable* ht, int key){ int index = hash(key, ht->size); HashNode* node = ht->table[index]; while(node != NULL){ if(node->key == key){ return node->value; } node = node->next; } return -1; } ``` 这里首先使用哈希函数计算键的索引,然后遍历该索引处的链表,查找对应的键值对。如果找到,则返回其值,否则返回-1。 以上就是使用链地址法实现哈希表的C语言代码示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值