哈希/数组

Java SHA哈希算法实现:从单向散列原理到完整工具类开发 哈希算法是计算机安全与数据完整性验证的核心基础技术,它通过单向散列函数将任意长度数据映射为固定长度的摘要值。其核心原理在于数学上的单向性,确保无法从哈希值反推原始数据,这一特性奠定了其在数据完整性校验和数字指纹应用中的技术价值。在软件开发中,哈希算法广泛应用于密码存储、文件校验、数字签名等场景,其中SHA系列算法因其安全性成为行业标准。本文聚焦Java平台,深入解析如何利用JCA架构的MessageDigest类实现SHA-256等算法,涵盖字符串编码处理、大文件流式哈希、恒定时间比较防计时攻击等工程实践, 阅读详情

一、两数之和

给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)

数据范围:2≤len(numbers)≤105,−10≤numbersi≤109,0≤target≤109

要求:空间复杂度 O(n),时间复杂度 O(nlogn)

import java.util.*;

public class Solution {
    // 二分查找
    private int binarySearch(int[][] nums, int i, int j, int target) {
        while (i <= j) {
            int mid = (i + j) / 2;
            if (nums[mid][0] == target) return mid;
            if (nums[mid][0] > target) j = mid - 1;
            else i = mid + 1;
        }
        return -1;
    }

    public int[] twoSum (int[] numbers, int target) {
        //排序, 双指针  第二个数可二分查找   空间O(n) 时间O(nlogn)
        int[][] nums = new int[numbers.length][2]; // numbers[i]及其下标+1
        for (int i = 0; i < numbers.length; i++) {
            nums[i][0] = numbers[i];
            nums[i][1] = i + 1;
        }
        Arrays.sort(nums, (a, b)->a[0] - b[0]); // 排序
        for (int i = 0; i < nums.length; i++) {
            int j = binarySearch(nums, i + 1, nums.length - 1, target - nums[i][0]); // 二分查找
            if (j > 0) {
                int x = nums[i][1], y = nums[j][1];
                return new int[] {Math.min(x,y), Math.max(x,y)};
            }
        }

        return null;
    }
}

运行结果

二、数组中出现次数超过一半的数字

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

数据范围:n≤50000,数组中元素的值 0≤val≤10000

要求:空间复杂度:O(1),时间复杂度 O(n)

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param numbers int整型一维数组
     * @return int整型
     */
    public int MoreThanHalfNum_Solution (int[] numbers) {
        // write code here
        int candidate = 0;
        int count = 0;
        for (int n : numbers) {
            if (count == 0) {
                candidate = n;
            }
            if (n == candidate) {
                count++;
            } else {
                count--;
            }
        }
        return candidate;
    }
}

运行结果

三、数组中只出现一次的两个数字

一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

数据范围:数组长度 2≤n≤1000,数组中每个数的大小 0<val≤1000000
要求:空间复杂度 O(1),时间复杂度 O(n)

提示:输出时按非降序排列。

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型一维数组
     */
    public int[] FindNumsAppearOnce (int[] nums) {
        // write code here
        // 先排序
        Arrays.sort(nums);
        // 结果list
        List<Integer> list = new ArrayList<Integer>();
        // 遍历
        for (int i = 0; i < nums.length; i++) {
            // 如果是第一个,只比较后面一个
            if (i == 0) {
                if (nums[i] != nums[i + 1]) {
                    list.add(nums[i]);
                }
            } else if (i == nums.length -
                       1) { // 如果是最后一个,只比较前面一个
                if (nums[i] != nums[i - 1]) {
                    list.add(nums[i]);
                }
            } else { // 比较左右两个
                if (nums[i] != nums[i + 1] && nums[i] != nums[i - 1]) {
                    list.add(nums[i]);
                }
            }
        }
        return list.stream()
               .mapToInt(Integer::intValue)
               .toArray();
    }
}

运行结果

四、缺失的第一个正整数

给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数

进阶: 空间复杂度 O(1),时间复杂度 O(n)

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int minNumberDisappeared (int[] nums) {
        // 算法核心思想:通过按正整数顺序的方式创建哈希记录,遍历数组登记哈希,然后遍历哈希
        // 算法时间复杂度O(N),额外空间复杂度O(N)(没做到O(1))

        // 1.遍历数组,记录数组中出现过的最小正整数值,并将所有正整数记录哈希表
        // 记录最小值是为了简化判断,若最小值>1可以直接返回1
        int min = Integer.MAX_VALUE;
        HashMap<Integer, Boolean> hm = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0) {
                hm.put(nums[i], true);
                if (nums[i] < min) {
                    min = nums[i];
                }
            }
        }
        if (min > 1) {
            // 若数组中出现过的最小正整数比1大,则可直接输出最小正整数1
            return 1;
        }
        // 其余情况均为从1开始出现,直到某个值没有出现

        // 2.从1开始遍历HashMap,输出最早未登记的key
        int i = 2;
        while (hm.containsKey(i)) {
            i++;
        }
        return i;
    }
}

运行结果

五、三数之和

给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。

import java.util.*;


public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        int n = num.length;
        Arrays.sort(num);
        for (int i = 0; i < n - 2; i++) {
            if (i != 0 && num[i] == num[i - 1]) {
                continue;
            }
            int l = i + 1, r = n - 1;
            while (l < r) {
                if (num[i] + num[l] + num[r] < 0) {
                    while (++l < r && num[l] == num[l - 1]) {}
                } else if (num[i] + num[l] + num[r] > 0) {
                    while (l < --r && num[r] == num[r + 1]) {}
                } else {
                    res.add(new ArrayList<>(Arrays.asList(num[i], num[l], num[r])));
                    while (++l < r && num[l] == num[l - 1]) {}
                    while (l < --r && num[r] == num[r + 1]) {}
                }
            }
        }
        return res;
    }
}

运行结果

Java项目实战:从MD5迁移到国密SM3哈希算法的完整指南 哈希算法是保障数据完整性和安全性的基础密码学工具,通过将任意长度数据映射为固定长度摘要,确保数据不可篡改。随着MD5和SHA-1等传统算法被证实存在碰撞漏洞,在金融、政务等对安全要求更高的领域,采用更安全的算法成为技术升级的必然选择。国密SM3算法作为我国密码管理局批准的标准杂凑算法,具备与国际主流算法相当的安全性,并满足特定行业的合规性要求。本文基于Bouncy Castle加密库,详细解析了在Java项目中集成SM3算法的完整流程,包括环境配置、核心工具类实现以及密码存储、文件校验、API签名等典型应用 阅读详情

相关推荐

保姆级教程:在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV(从BIOS到虚拟机配置)

本文提供在ESXi 8.0上为NVIDIA ConnectX-5/6网卡开启SR-IOV的详细教程,涵盖BIOS设置、固件配置、驱动优化及虚拟机部署。通过SR-IOV技术,显著提升虚拟化环境中的网络性能,适用于高性能计算、AI训练等场景。

weixin_26934905的博客 455

如何动态的向数组中插入键值对_OI/ACM中的哈希表,一些哈希算法以及题目

<如果你已经学习过哈希有关知识,也推荐看一下后面的补充知识及题目>问题引出:假设有一个集合 ,里面装满了形如 的键值对, 值是唯一的。现在想在尽可能短的时间内取出 对应的 的值,要怎么做比较好呢?假设集合中有 个不同的 ,那么当我们可以定义一个函数以 为自变量的函数 ,它能使得 等于某个 的整数,并且对于 。当计算 函数的代价是 的,通过开一个大小为 的 ...

weixin_39995774的博客 315

网易数智CoreAgent实战:5步教你打造企业级AI数字员工(附避坑指南)

本文以网易数智CoreAgent智能体协作中枢为核心,提供了一份企业级AI数字员工的实战部署指南。文章详细拆解了从环境准备、智能体配置、业务集成、安全合规到效果评估的五个关键步骤,并分享了部署过程中的常见“避坑”经验,旨在帮助企业技术团队高效、安全地将AI智能体落地于实际业务场景,解决AI落地难题。

rice5的博客 952

从PHP的Hash(哈希)算法开始

转自:http://www.nowamagic.net/academy/detail/1200001 哈希表在PHP中的重要性 Hash Table是PHP的核心,这话一点都不过分。 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表。PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储上下文环境信息(执行上下文的

空灵游侠 1497

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

静态时序分析(Static Timing Analysis, STA):简介及内容导航

静态时序分析(简称STA)是用来验证数字设计时序的技术之一,另外一种验证时序的方法是时序仿真,时序仿真可以同时验证功能和时序。“时序分析”这个术语就是用来指代“静态时序分析“或”时序仿真“这两种方法之一,简单来说,时序分析的目的就是为了解决设计中的各种时序问题。STA被称为静态的原因是其对于设计的分析是静态地执行的,并不依赖于施加在输入端口上的激励。相比之下,时序仿真则可以被视作动态地执行对设计的分析,具体过程描述如下:施加一组激励,观察在这组激励下电路行为是否符合要求,然后换一组激。

Starry__的博客 1989

perl/中位值/二维哈希/数组的哈希/排序/取整

Perl求数组中位值 use List::Util qw(sum); use POSIX; sub median { sum((sort { $a &amp;lt;=&amp;gt; $b } @_ )[int($#_/2), ceil($#_/2)])/2; }

linkequa的博客 3902

Ardupilot无人船(车)mavros自主控制

rover 4.4。

超维空间科技的博客 3229

【leetcode/哈希表】两个数组的交集(用哈希集去重)

问题描述: 给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [9,4] 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 基本思路: 使用两个哈希表...

qq_43338695的博客 468

【华为OD机试】真题A卷-Linux发行版的数量(Python)

【华为OD机试】真题A卷-Linux发行版的数量(Python):Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。 发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行版。给你一个nxn的矩阵isConnected,其中isConnected[i][i]=1表示第i个发行版和第j个发行版直接

u014481728的博客 943

【图像超分】论文复现:Pytorch实现ESPCN

论文精读:由于ESPCN没有公布源码,我们选择github上一个高star的项目来复现。准备数据集,以及数据预处理搭建网络模型设置参数并训练测试训练好的模型用训练好的模型测试自己的数据本文我们使用pycharm链接服务器训练。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1万+

终极指南:Data-Structures-and-Algorithms项目哈希表实现原理与FNV哈希算法详解

Data-Structures-and-Algorithms是一个使用Go语言实现数据结构与算法的开源项目,其中哈希表(HashTable)组件采用FNV哈希算法实现高效的键值对存储与查找。本文将深入解析该项目中哈希表的实现原理,带你掌握FNV算法的工作机制及哈希表的核心操作。 ## 哈希表基础:为什么选择FNV算法? 哈希表是一种通过键直接访问数据的高效数据结构,其性能取决于哈希函数的质量。

gitblog_01005的博客 436

【RT-DETR有效改进】利用ASF-YOLO改进特征融合层(附代码 + 详细教程)

本文给大家带来的改进机制是ASF-YOLO(发布于2023.12月份的最新机制),其是特别设计用于细胞实例分割。这个模型通过结合空间和尺度特征,提高了在处理细胞图像时的准确性和速度。在实验中,ASF-YOLO在2018年数据科学竞赛数据集上取得了卓越的分割准确性和速度,达到了0.91的box mAP(平均精度),0.887的mask mAP,以及47.3FPS的推理速度,效果非常的好,这个结构本来是用于分割的,我将其移植到了目标检测的模型上,所以其可以适用于分割和目标检测。

Snu77的博客 2294

什么是 Hash 碰撞?怎么解决哈希碰撞?

本文详细介绍了哈希碰撞的概念、影响及解决方法。哈希碰撞是指不同输入通过哈希函数得到相同输出值,这是由于输入空间无限而输出空间有限导致的必然现象。碰撞会严重影响哈希表性能,如Java HashMap可能从O(1)退化到O(n)时间复杂度。解决碰撞主要有两种方法:链地址法(将碰撞元素存储在链表中)和开放地址法(线性探测或二次探测寻找空位)。文章通过Java代码示例演示了碰撞现象、性能影响及解决方案的具体实现,帮助理解哈希表底层工作原理及优化思路。

weixin_45422672的博客 195

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

告别哈希冲突:nlohmann/json的智能哈希策略与实战指南

你是否曾为JSON对象的哈希计算头疼?当`null`、`0`和`false`返回相同哈希值时,调试就像在迷宫中寻找出口。nlohmann/json库通过精妙的`std::hash`集成与自定义哈希机制,为现代C++开发者提供了开箱即用的哈希解决方案。本文将深入解析哈希实现原理,手把手教你处理复杂哈希场景,让你的JSON操作从此告别哈希烦恼。 ## 哈希实现核心:从std::hash到类型感知

gitblog_00991的博客 1218

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

原地哈希算法:高效找出数组中缺失的数字

数组处理是编程中的基础操作,其中原地哈希算法通过巧妙利用数组索引与值的映射关系,实现了在不使用额外空间的情况下标记元素存在状态。这种算法的核心原理是将数组本身作为哈希表,通过修改元素符号位来记录信息,既保证了O(n)的时间复杂度,又达到了O(1)的空间复杂度要求。在数据校验、分布式系统同步等实际工程场景中,该技术能有效解决连续ID缺失检测、数据包完整性验证等问题。特别在处理大数据量时,相比传统哈希表法可节省50%以上内存,是空间敏感型应用的理想选择。本文以Python实现为例,详解如何通过两次线性遍历完成缺

weixin_27061475的博客 272

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

常见的三种哈希结构(数组,set,map)

哈希算法的三种常见结构

脑子不好的小菜的博客 1761

第三章:PE文件导出表结构与ROR13哈希算法

本文详解PE文件导出表结构与ROR13哈希算法的应用。通过解析DOS头、NT头及数据目录,定位导出表,利用AddressOfNames、AddressOfNameOrdinals和AddressOfFunctions三数组遍历函数名,结合ROR13哈希避免明文字符串暴露,实现无痕查找API地址。代码示例验证了该方法在绕过杀软检测中的有效性,适用于注入器等安全场景。

分享个人整理的笔记 全部无偿提供,欢迎关注 173

C# Dictionary底层原理:哈希算法与冲突解决机制

字典(Dictionary)是.NET中高频使用的键值存储结构,其核心依赖哈希表实现。理解哈希算法如何将键映射为数组索引、为何需兼顾雪崩效应与位运算效率、以及哈希冲突的两种主流应对策略(拉链法与开放寻址),是掌握高性能数据结构的关键。.NET从Framework到Core的演进中,通过哈希扰动、_hashes缓存数组、线性探测等优化显著提升了缓存局部性与查找速度。这些底层机制直接决定着C#程序在金融交易、实时服务等场景下的吞吐量与稳定性。本文聚焦字典的内存布局、哈希冲突处理及实际避坑经验,帮助开发者超越AP

weixin_29271053的博客 317

HashMap底层原理与工程实践:从哈希算法到并发安全

HashMap是Java集合框架中最核心的散列表实现,其本质是通过哈希算法将键映射到数组索引,以实现平均O(1)时间复杂度的查找。其性能与可靠性取决于四大基础机制:数组+链表+红黑树的混合数据结构选型、扰动函数参与的哈希计算过程、非线程安全的put/resize临界行为,以及基于2的幂次方容量的扩容重哈希机制。这些设计共同决定了它在高并发、大数据量、低延迟等典型工程场景中的适用边界与调优路径。理解HashMap,不仅是掌握一个容器类,更是深入JVM内存布局、哈希冲突治理和无锁编程思想的关键入口。本文聚焦哈希

weixin_32308101的博客 115

chapter03-哈希表/散列表/Hash table

文章目录242.有效的字母异位词1002. 查找常用字符349. 两个数组的交集 核心:一般哈希表都是用来快速判断一个元素是否出现集合里。 242.有效的字母异位词 1002. 查找常用字符 349. 两个数组的交集 ...

qq_43336324的博客 1084

hash table - hash map - 哈希表 - 散列表

hash table - hash map - 哈希表 - 散列表 In computing, a hash table (hash map) is a data structure that implements an associative array abstract data type, a structure that can map keys to values. A hash table uses a hash function to compute an index, also called

程永强 550

哈希算法(C++)

常见的三种哈希结构有哪些?什么时候想到哈希?哈希表用哪个?什么时候想到数组?什么时候想到set?什么时候想到map?map分为哪三种?map是用来存什么的?map的关键字key和值value怎么选?

wasb666的博客 205

必学算法——哈希算法

哈希算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在一些公司面试题中都可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解哈希算法。哈希算法,也称为散列算法,是一种数学函数或算法,它能够将任意长度的数据(称为“消息”)转换为固定长度的字符串(称为“哈希值”或简称“哈希”)。学习算法是一个很艰难,漫长的过程,我们要克服一切困难,学习算法本就是由易到难,我相信通过我们坚持不懈的努力一定能理解并熟练掌握其中细节,加油,我相信你一定能行。

ycs66的博客 5286

【hash】哈希算法、哈希碰撞、一致性哈希

一、hash算法 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 哈...

鲜衣怒马楼兰月 4578

哈希算法和哈希表

这篇文章将会简单介绍几种常见的哈希算法,然后是C++或Java的标准库中哈希函数与哈希表的基本使用,最后将会提供一个使用C语言手搓FNV-1a算法的示例,以及使用它实现的哈希表。这篇文章虽然内容不多,但前前后后,也是删删改改了好多天了,虽然内容还是不尽人意,但希望此文能为你提供一点帮助,不说理解哈希,至少能够使用吧。不知道某位大佬会不会来看这篇文章,关于哈希表的部分我不是很拿得准,如果理解有误,请帮我指出。

qq_41757528的博客 2534
上一篇: 堆/栈/队列
下一篇: 递归/回溯
w_zero_one
博客等级 码龄2年 149粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值