两个数组的交集、有效的完全平方数、字符串中的第一个唯一字符

寻找两个字符串的交集(c语言) 我的思路: 1.将两个字符串简化,将里面重复的字母减少为一个。 2.拼接两个字符串,借助循环把重复出现两次的字符找出来。 阅读详情

🍅 Java学习路线:搬砖工逆袭Java架构师

🍅 简介:Java领域优质创作者🏆、优快云哪吒公众号作者✌ 、Java架构师奋斗者💪

🍅 百日刷题计划:第 14 / 100 天。

🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步 

🍅 欢迎点赞 👍 收藏 ⭐留言 📝 

位于半山腰的城堡酒店坐拥港口美景


算法是进阶架构师的基础,基础不牢,地动山摇,2021-8-14起开始刷题,目标100天,300道LeetCode算法题,分享是学习的最好方式,加油,嗨起来。


1、LeetCode 350.两个数组的交集


题目

给定两个数组,编写一个函数来计算它们的交集。

小编菜解

public static int[] intersect(int[] nums1, int[] nums2) {
    List<Integer> list1 = new ArrayList<>();
    List<Integer> list2 = new ArrayList<>();
    for (int i = 0; i < nums1.length; i++) {
        list1.add(nums1[i]);
    }

    for (int i = 0; i < nums2.length; i++) {
        list2.add(nums2[i]);
    }
    return getIntersection(list1,list2);
}

public static int[] getIntersection(List<Integer> list1, List<Integer> list2) {
    if (list1.size()>list2.size()){
        return getIntersection(list2,list1);
    }
    List<Integer> list = new ArrayList<>();
    for (Integer x : list1){
        if (list2.contains(x)){
            list.add(x);
            list2.remove(x);
        }
    }
    int[] ret = new int[list.size()];
    for (int i = 0; i < list.size(); i++) {
        ret[i] = list.get(i);
    }
    return ret;
}

思路及算法

为了降低空间复杂度,首先遍历较短的数组并在哈希表中记录每个数字以及对应出现的次数,然后遍历较长的数组得到交集。

大佬指点江山

public static int[] intersect(int[] nums1, int[] nums2) {
    if (nums1.length>nums2.length){
        return intersect(nums2,nums1);
    }
    Map<Integer,Integer> map = new HashMap<>();
    for (int num : nums1) {
        int count = map.getOrDefault(num,0) + 1;
        map.put(num,count);
    }
    int[] arr = new int[nums1.length];
    int index = 0;
    for (int num : nums2) {
        int count = map.getOrDefault(num,0);
        if (count > 0){
            arr[index++] = num;
            count--;
            if (count > 0){
                map.put(num,count);
            }else {
                map.remove(num);
            }
        }
    }
    return Arrays.copyOfRange(arr,0,index);
}

list的效率肯定是低于map的,而我的list还要进行增删操作,故而效率低于大佬的解答。 

2、LeetCode 387.有效的完全平方数

题目

给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。

进阶:不要 使用任何内置的库函数,如  sqrt 。

小编菜解

public static boolean isPerfectSquare(int num) {
    if (num == 1){
        return true;
    }
    for (int i = 2; i < num; i++) {
        if (num%i == 0 && num/i == i){
            return true;
        }
    }
    return false;
}

提示超出时间限制! 

小编菜解进阶版

public static boolean isPerfectSquare(int num) {
    if (num == 1){
        return true;
    }
    int middle = num/2;
    int left = 2;
    int right = num;
    if (num == middle*middle) {
        return true;
    }else if (num > middle*middle){
        left = middle+1;
    }else{
        right = middle - 1;
    }
    for (int i = left; i <= right; i++) {
        if (num%i == 0 && num/i == i){
            return true;
        }
    }
    return false;
}

仍然超出时间限制! 

大佬指点江山

public static boolean isPerfectSquare(int num) {
    if (num == 1){
        return true;
    }
    long left = 2;
    long right = num/2;
    long middle = 0;
    while (left<=right){
        middle = left+(right - left)/2;
        if (num == middle * middle){
            return true;
        }
        if (num > middle * middle){
            left = middle+1;
        }else {
            right = middle - 1;
        }
    }
    return false;
}

真的是菜,什么是二分查找,每次都要进行二分查找,而不是只进行一次,进行一次和不进行,效率上没有任何区别!

3、LeetCode 387.字符串中的第一个唯一字符

题目

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

小编菜解

public static int firstUniqChar(String s) {
    Map<Character,Integer> map = new LinkedHashMap<>();
    //将字符和个数放入map中
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (map.containsKey(c)){
            map.put(c,map.get(c)+1);
        }else{
            map.put(c,1);
        }
    }
    //找到第一个值为1的key,因为是LinkedHashMap,所以顺序和字符串顺序一致
    char find = 0;
    for(Map.Entry<Character,Integer> entry : map.entrySet()){
        if (entry.getValue() == 1){
            find = entry.getKey();
            break;
        }
    }
    //再通过找到的第一个唯一字符,找到它的位置
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == find){
            return i;
        }
    }
    return -1;
}

虽然,写出来了,但肯定不是最优解,麻烦的令人发指。 

大佬指点江山

public static int firstUniqChar(String s) {
    Map<Character,Integer> map = new LinkedHashMap<>();
    //将字符和个数放入map中
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        map.put(c,map.getOrDefault(c,0)+1);
    }
    //再通过找到的第一个唯一字符,找到它的位置
    for (int i = 0; i < s.length(); i++) {
        if (map.get(s.charAt(i))==1){
            return i;
        }
    }
    return -1;
}

大体思路是一样的,只不过我多了一步,不应该啊。

推荐阅读

【100天算法入门 - 每日三题 - Day13】反转字符串、反转字符串中的元音字母、两个数组的交集

【100天算法入门 - 每日三题 - Day12】Nim游戏、3的幂、4的幂

【100天算法入门 - 每日三题 - Day11】丢失的数字、移动零、单词规律

【100天算法入门 - 每日三题 - Day10】二叉树的所有路径、各位相加、丑数 

【100天算法入门 - 每日三题 - Day9】汇总区间、2的幂、有效的字母异位词

【100天算法入门 - 每日三题 - Day8】同构字符串、存在重复元素、翻转二叉树

【100天算法入门 - 每日三题 - Day7】验证回文串、只出现一次的数字、多数元素

...

【100天算法入门 - 每日三题 - Day3】回文数、罗马数字转数字、最大公共前缀

【100天算法入门 - 每日三题 - Day2】二分查找、第一个错误的版本、搜索插入位置

【100天算法入门 - 每日三题 - Day1】二叉树的中序遍历、两数之和、整数反转

《生成式AI引发的“认知污染”:社交媒体虚假信息的治理困局》 认知污染与生成式AI“认知污染”指信息环境被大量虚假、误导性内容所充斥,干扰公众对事实的认知判断。在社交媒体时代,虚假信息的生产和传播门槛大幅降低,呈现出工业化、规模化的趋势。近年兴起的生成式人工智能(Generative AI)技术,如大型语言模型(LLM)和深度伪造(deepfake),更是加剧了这一问题。AI可以自动生成看似真实的文本、图像、音视频,将虚假信息批量生产并快速散播到社交平台上。 阅读详情

相关推荐

西门子PLC1200与CB1241模块的Modbus RTU从站配置全流程(附串口调试技巧)

本文详细介绍了西门子S7-1200 PLC与CB1241通信模块实现Modbus RTU从站配置的全流程,包括硬件接线规范、TIA Portal工程组态、通信指令编程及串口调试技巧。通过实战案例和常见错误处理方案,帮助工程师快速搭建稳定的工业通信系统,提升自动化设备的互联互通能力。

weixin_29165725的博客 324

一维数组案例

// 求最小值(第一种): 需求:获取指定数组中偶数元素值的最小值 Scanner input = new Scanner(System.in); // 1.定义一个 int 数组 arr int[] nums = new int[5]; // 2.键盘录入5个整数,存入数组 arr 中,并且录入之前提示输入的是第几个数字 for (int i = 0; i < nums.length; i++) { System.out.printf("输入第%d个整数:", i+1); num.

weixin_57488568的博客 872

UE5.4像素流送实战:GPU驱动、WebRTC与系统级调优全解析

像素流送是将实时3D渲染画面通过WebRTC编码推流至浏览器的关键技术,其本质是GPU硬件编码(如NVENC)与低延迟网络传输(UDP+BBR)的深度协同。理解其原理需跨越图形API(Vulkan/DX12)、实时音视频(H.264/H.265)、WebRTC信令与NAT穿透四大技术层。技术价值在于突破终端算力限制,支撑远程工业仿真、云VR看房等高交互场景;但落地难点集中于基础设施层——如NVIDIA驱动与UE5.4.3的CUDA Toolkit 12.2兼容性、Linux内核TCP/UDP参数调优、GPU

weixin_32943857的博客 614

范围for循环

foreach遍历学习`for(int num : nums2)` for(int num : nums2) 刚开始学习C++,在leetcode看到大神写的代码中有 for(int num : nums2) 一脸懵逼 怀疑自己看了个假视频,学的C++是上个世纪的,从网上查找了下资料,特此整理学习! 其实这就是简化的循环写法,善于观察的同学结合上下代码语句,应该猜个大概。 等同于 int num; for(int i=0;i<nums.length;i++) { num=nums2[i]; } 文

HFGD2019的博客 6649

OpenCV+ArUco实战:如何用Python实现高精度二维码测距(附完整代码)

本文详细介绍了如何使用Python和OpenCV实现基于ArUco标签的高精度单目视觉测距。通过相机标定、标签检测和三维位置估算,结合完整代码示例,帮助开发者在机器人导航、工业自动化等场景中实现厘米级距离测量,并探讨了精度优化与三维可视化等进阶应用。

weixin_29052717的博客 474

记一次springboot集成海康威视SDK过程

一开始没有接触过物联网这块,走了很多弯路,后面还是自己一点点摸索出来的。有个项目,需要对海康的门禁设备进行集成,后台统一管理设备,进行设备人脸数据的下发、删除等操作。3.我还接入了门禁设备的事件监听,门禁所有的事件都会上报到后台服务,这块代码有需要的可以找我。在linux系统中,sdk我使用的是绝对路径,把Linux版本的文件放到服务时,Acs文件夹下的 各个Manage都有现成的代码,可以根据自己的需要调用即可。路径也不要有中文,切记!2.sdk的存放路径不要有中文,不然会出现很多奇怪的问题。

huang_xiaoen的博客 2348

【数据结构c++】双指针(九)

1. 双指针 两数之和 II - 输入有序数组: https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/ class Solution { public: vector<int>twoSum(vector<int>&numbers, int target) { int low = 0, high = numbers.size()-1; while(low < high)

qq_44747572的博客 583

如何导入su_利用GIS快速生成SU场地模型

01|前言:进入2021年了,希望大家也是一个新的开始。告诫自己多写文章多更新,多读点书多旅行。然而元旦由于出去玩了4天,积累了一些事情要处理,一直没有时间好好写点东西。今天给大家带来的分享主题叫“利用GIS快速生成SU场地模型”。相关的视频方法其实B站上也有,但我相信视频很多人都不会看,我自己也是。直接给大家上操作流程。主要的操作步骤是【获取场地的矢量shp文件】—【导入ArcScen...

weixin_33806859的博客 9813

349. 两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序 解答: class Solution { public: vector<int> intersection(vector<int>&

WhiteGray的博客 239

OAI骨关节炎数据集申请与DICOM下载全流程避坑指南

医学影像分析中,DICOM格式是存储与交换CT、MRI等数据的通用标准,其元数据Tag承载着像素间距、层厚等关键物理信息,直接影响定量分析的准确性。在骨关节炎研究领域,OAI数据集因样本量大、随访时间长而成为高价值资源,但获取需通过NDA协议申请,并借助nda-tools命令行工具完成TB级影像的批量下载与断点续传。这一流程涉及浏览器环境配置、DICOM格式转换及Python预处理等工程环节,任一细节疏漏都可能导致数据读取异常或分析偏差。掌握从申请到落地的完整链路,能显著提升医学影像AI研究的效率与可复现性

weixin_30843121的博客 275

oracle合并行---解决listagg 拼接字段返回过长 (Ora-01489 result of String concatenation is too long)

oracle合并行---解决listagg 拼接字段返回过长 (Ora-01489 result of String concatenation is too long)

清影的博客 6281

leetcode小白随笔记(二)

auto类型说明符 用它就能让编译器替我们去分析表达所属的类型。 string对象上的操作 初始化的方式 string对象 上的操作 标准库类型vector 定义和初始化vector对象 迭代器介绍 标准容器迭代器的运算符 使用迭代器,不使用小标操作,避免随机访问 容器操作 获取迭代器 将一个容器初始化为另一个容器的拷贝 将一个新容器创建为另一个容器的拷贝的方法有两种:可以直接拷贝整个容器,或者(array除外)拷贝一个迭代器对指定的元素范围。 截图来自:C++_Primer_第5版_中文 vector初始

花开 流年 739

互联网的发展简史—web

互联网是我现在生活所离不开的一个东西,但是你知道互联网的前世今生吗?本文将讲解互联网的发展史,以及很火的元宇宙概念。

yj11290301的博客 3561

力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码

349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码,每题做详细思路梳理,配套Python&Java双语代码, 2024.04.02可通过leetcode所有测试用例。

引用原创内容标明出处即可 1226

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

输出两个字符串数组中的交集

编写方法searchInsect,返回值为交集的集合,其参数为两个字符串集合s1和s2。 方法解释:首先将s1放入map集合中;遍历s2,如果s2中的在map中包含,则值设置为true;最后将map中所有值为true的间保存在list中返回。 这里要注意返回的是数组,所以需要将list集合转换为数组:使用toArray方法,参数为数组类型即可。 代码: package mianshi...

小蜗牛的博客 1185

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

如何求两个字符串的交集? 用js求字符串交集和字符串相减结果

用js求字符串交集和字符串相减结果 有时候我们可能会求两个字符串的交集,也就是找到两个字符串里面相同的元素,偶尔也会需要把一个字符串里的与另外的一个字符串重合的元素给删除掉,所以诞生了这篇文章。下面给出案例: 已知有a,b两个字符串,字符串都是由多个词语组成且中间有空格隔开,想要知道a,b字符串有哪些词语相同,并且把其中a字符串内a&b同时存在(即交集)的词语给删除掉,得到一个新的字符串。 解题思路: 1.先把字符串使用split()函数转变成数组 2.再使用filter()函数求得交集 3.使用s

qq_21650491的博客 3261

LeetCode 求数组和字符串数组中的交集(C++)

1、两个数组的交集 问题描述 给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 解题思路 使用C++的STL中的求两个集合的交集的函数是:set_intersection()。语法格式是:set_intersection(v

bwqiang的博客 867

Java习题2:在一个类中实现中实现两个字符串数组的逆序排序、两个整形数组的交集、两个浮点型数组的并集等方法

问题描述:定义一个类,该类中包含以下几个方法(静态): (1)实现两个字符串数组的逆序排序,输出结果为字符串数组; (2)求两个整形数组的交集; (3)求两个浮点型数组的并集。 解决思路: (1)实现两个字符串数组的逆序:定义一个新的字符串数组Str,长度为需要逆序的两个字符串数组Str1和Str2之和。将Str1和Str2先后逆序存入输出结果中,最后将输出结果作为返回值即可。 (2)求两个整形数组的交集:定义一个新的整型数组numbers,长度定义为两个整型数组numbers1和numbers2长度之和(

xfjssaw的博客 1203

获取两个字符串数组交集纪要

/** * .获取两个字符串数组交集. * @param strArrA * @param strArrB * @return * @author alm02. */ public static String[] GetIntersection(String [] strArrA, String [] strArrB) { Map<String,Boolean> map = new HashMap<String,Boolean>(); List<.

大雷 453

java 两个数组取交集_java对两个字符串数组取交集、并集和差集

直接上代码。import java.util.*;public class StringArrayUtil {// 求两个字符串数组的并集,利用set的元素唯一性public static String[] union(String[] arr1, String[] arr2) {Set set = new HashSet<>();Collections.addAll(set, arr...

weixin_36150766的博客 2075

一刷Day6|242.有效的字母异位词 349. 两个数组的交集 1. 两数之和

亮点是使用一个固定大小的数组来存储字符频率,这种方法在时间复杂度上是高效的(O(n)),其中n是字符串的长度。难点在于如何高效地实现查找操作,亮点是使用哈希表来优化查找过程,将时间复杂度从可能的 O(n^2) 降低到 O(n)。,检查每个元素是否存在于哈希表中,如果存在并且不在结果数组中,则将其添加到结果数组中。核心功能是快速查找数组中是否存在两个数,它们的和等于给定的目标值。库)来存储数组元素的值和它们的索引,以便快速查找两个数的和是否等于目标值。中,这是一个常见的优化策略,可以显著提高查找效率。

2301_78809750的博客 2052

242. 有效的字母异位词| 349. 两个数组的交集

如0,100万,如果用数组来做映射的话,要用100万那么大的数组,但实际运用的只有三个。加了这个限制之后,这道题目用数组来求解,用哈希表的结构是比较合适的。当这里面的数值非常大的时候,我们想用数组来做映射就不合适了。然而,由于哈希表的性质,它在平均情况下的插入、删除和查找操作都具有常数时间复杂度(尽管在最坏情况下可能会退化到线性时间复杂度,但这通常不会发生)。它存储的元素是唯一的,且按照一定的顺序(默认情况下是升序,但可以通过自定义比较函数来改变)进行存储。也是基于红黑树实现的,但它允许存储重复的元素。

m0_46322965的博客 2064

快速的判断两个字符串型数组是否有交集

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33875839的博客 2895

C++求两个字符串的交集

C++求两个字符串的交集 ```cpp #include <iostream> #include<string.h> using namespace std; void selection(char J[],char S[],int n,int m){//取交集 int i,j; int sum=0; for(j=0;j<m;j++){ for(...

qq_41448372的博客 2894

获取两个字符串数组的交集

public static String[] getInterSection(String[] arr1, String[] arr2) { if(ArrayUtils.isEmpty(arr1)|| ArrayUtils.isEmpty(arr2)) { return new String[0]; } HashSet&l...

bobohoo的专栏 919

PostgreSQL数组如何去除交集

PostgreSQL中支持多种类型的数据类型,其中数组类型在pg中也是被频繁使用的一种,我们可以定义某列为变长多维数组。 那么对于不同数组我们怎么获取数组的交集,进行去除交集等操作呢? 对于字符串,我们可以使用except来直接进行去除交集,那么数组该怎么办呢? 对于数组的去除交集我们的思路大致为: 1、先把数组转换成字符串; 2、将字符串的元素拆分然后进行去除交集; 3、将获得的字符串转换成数组。 例子: 我们使用上述的思路来将[1,2,3,4,5]和[2,3]这两个数组进行去除交集。 1、数组转换字符串

Focus on PostgreSQL 3325
上一篇: Nim游戏、3的幂、4的幂
下一篇: 判断子序列、最长回文数、Fizz Buzz
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2933原创
评论 126
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值