力扣题目学习笔记(OC + Swift)
训练思维,提高编程能力,不为刷题而刷题
文章目录
- 1. 两数之和
- Swift版本
- OC版本
- 2. 两数相加
- Swift实现
- OC实现
- 3.无重复字符的最长子串
- Swift
- OC
- 4.寻找两个正序数组的中位数
- Swift
- OC
1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
Swift版本
class Solution {func twoSum(_ nums: [Int], _ target: Int) -> [Int] {var map = [Int : Int]()for (i, e) in nums.enumerated() {if let u = map[target - e] {return [u, i]}else {map.updateValue(i, forKey: e)}}return []}
}
OC版本
- (NSArray *)twoSum:(NSArray <NSNumber *>*)nums target:(NSInteger)target {NSMutableDictionary *mutDic = [NSMutableDictionary dictionary];__block NSArray *result = nil;[nums enumerateObjectsUsingBlock:^(NSNumber * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {NSNumber *num = mutDic[@(target - obj.integerValue)];if (num) {result = @[num, @(idx)];*stop = YES;}else {mutDic[obj] = @(idx);}}];return result;
}
测试代码:
NSArray *testArr = [NSArray arrayWithObjects:@(2),@(7),@(11), @(15), nil];NSArray *resu = [self twoSum:testArr target:18];if (resu) {NSLog(@"找到结果:%ld, %ld", [resu[0] integerValue], [resu[1] integerValue]);}
2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
Swift实现
class Solution {func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {var listNode1 = l1;var listNode2 = l2;//进位var carry: Int = 0;let result: ListNode = ListNode(0)var currentNode = resultwhile listNode1 != nil || listNode2 != nil || carry > 0 {let sum: Int = (listNode1?.val ?? 0) + (listNode2?.val ?? 0) + carrycurrentNode.next = ListNode(sum % 10)currentNode = currentNode.next!listNode1 = listNode1?.nextlistNode2 = listNode2?.nextcarry = sum / 10}return result.next}
}
OC实现
- (ListNode *)addTwoNumber:(ListNode *)l1 listNode2:(ListNode *)l2 {ListNode *result = [[ListNode alloc] initWithVal:0];ListNode *currentNode = result;ListNode *listNode1 = l1;ListNode *listNode2 = l2;//进位标记NSInteger carry = 0;while (listNode1 || listNode2 || carry > 0) {NSInteger sum = listNode1.val + listNode2.val + carry;currentNode.next = [[ListNode alloc] initWithVal:sum%10];currentNode = currentNode.next;listNode1 = listNode1.next;listNode2 = listNode2.next;carry = sum / 10;}return result.next;
}
3.无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
Swift
/** 滑动窗口法*/
func lengthOfLongestSubstring(_ s: String) -> Int {let strlen = s.countlet chs: [Character] = Array(s)var map = [Character : Int]()var start = 0var maxLen: Int = 0for i in 0..<chs.count {let char = chs[i]if let preIdx = map[char] {start = max(start, preIdx+1)}map[char] = i;maxLen = max(maxLen, i-start+1)print(start, maxLen)}return maxLen}
OC
/** 滑动窗口法*/- (NSInteger)lengthOfLongestSubstring:(NSString *)s {if (s.length < 2) {return s.length;}NSInteger strLen = s.length;NSInteger maxLen = 0;NSInteger start = 0;NSMutableDictionary *map = [NSMutableDictionary dictionary];for (NSInteger i=0; i<strLen; i++) {unichar c = [s characterAtIndex:i];NSString *charStr = [NSString stringWithCharacters:&c length:1];NSNumber *idxNum = [map objectForKey:charStr];if (idxNum) {start = MAX(start, [idxNum integerValue] + 1);}map[charStr] = @(i);maxLen = MAX(maxLen, i-start+1);}return maxLen;
}
4.寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
Swift
class Solution {func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double {let totalLen = nums1.count + nums2.count;if totalLen % 2 == 0 {let sum = getKthElement(num1: nums1, num2: nums2, kth: (totalLen+1)/2) + getKthElement(num1: nums1, num2: nums2, kth: (totalLen+2)/2)return Double(sum) / 2.0}else {let res = getKthElement(num1: nums1, num2: nums2, kth: (totalLen+1)/2)return Double(res)}}/* 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 进行比较* nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共计 k/2-1 个* nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共计 k/2-1 个* 取 pivot = min(pivot1, pivot2),两个数组中小于等于 pivot 的元素共计不会超过 (k/2-1) + (k/2-1) <= k-2 个* 这样 pivot 本身最大也只能是第 k-1 小的元素* 如果 pivot = pivot1,那么 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums1 数组* 如果 pivot = pivot2,那么 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums2 数组* 由于我们 "删除" 了一些元素(这些元素都比第 k 小的元素要小),因此需要修改 k 的值,减去删除的数的个数*/func getKthElement(num1: [Int], num2:[Int], kth: Int) -> Int {let m: Int = num1.countlet n: Int = num2.countvar k = kthvar index1: Int = 0, index2: Int = 0while true {//处理边界情况if index1 == m {return num2[index2 + k - 1]}if index2 == n {return num1[index1 + k - 1]}if k == 1 {return min(num1[index1], num2[index2])}//处理正常情况let newIdx1: Int = min(index1 + k/2 - 1, m-1)let newIdx2: Int = min(index2 + k/2 - 1, n-1)let pivot1 = num1[newIdx1]let pivot2 = num2[newIdx2]if pivot1 <= pivot2 {k -= newIdx1 - index1 + 1index1 = newIdx1 + 1}else {k -= newIdx2 - index2 + 1index2 = newIdx2 + 1}}}
}
OC
- (CGFloat)findMedianSortedArraysWithNums1:(NSArray *)num1 nums2: (NSArray *)num2 {NSInteger totalLength = num1.count + num2.count;if (totalLength % 2 != 0) {return [self getKthElement:num1 arr2:num2 kth:(totalLength+1)/2];}else {CGFloat result = ([self getKthElement:num1 arr2:num2 kth:(totalLength+1)/2] + [self getKthElement:num1 arr2:num2 kth:(totalLength+2)/2])/2.0;return result;}
}/* 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 进行比较* 这里的 "/" 表示整除* nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共计 k/2-1 个* nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共计 k/2-1 个* 取 pivot = min(pivot1, pivot2),两个数组中小于等于 pivot 的元素共计不会超过 (k/2-1) + (k/2-1) <= k-2 个* 这样 pivot 本身最大也只能是第 k-1 小的元素* 如果 pivot = pivot1,那么 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums1 数组* 如果 pivot = pivot2,那么 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums2 数组* 由于我们 "删除" 了一些元素(这些元素都比第 k 小的元素要小),因此需要修改 k 的值,减去删除的数的个数*/
- (NSInteger)getKthElement:(NSArray <NSNumber *>*)num1 arr2:(NSArray <NSNumber *>*)num2 kth:(NSInteger)k {NSInteger m = num1.count;NSInteger n = num2.count;NSInteger index1 = 0, index2 = 0;while (true) {//处理边界情况if (index1 == m) {NSNumber *num = num2[index2 + k - 1];return [num integerValue];}if (index2 == n) {NSNumber *num = num1[index1 + k - 1];return [num integerValue];}if (k == 1) {return MIN([num1[index1] integerValue], [num2[index2] integerValue]);}//正常情况NSInteger newIndex1 = MIN(index1+k/2-1, m-1);NSInteger newIndex2 = MIN(index2+k/2-1, n-1);NSInteger pivot1 = [num1[newIndex1] integerValue];NSInteger pivot2 = [num2[newIndex2] integerValue];if (pivot1 <= pivot2) {k -= newIndex1 - index1 + 1;index1 = newIndex1 + 1;}else {k -= newIndex2 - index2 + 1;index2 = newIndex2 + 1;}}
}
相关文章:
力扣题目学习笔记(OC + Swift)
训练思维,提高编程能力,不为刷题而刷题 文章目录 1. 两数之和Swift版本OC版本 2. 两数相加Swift实现OC实现 3.无重复字符的最长子串SwiftOC 4.寻找两个正序数组的中位数SwiftOC 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请…...
20. Spring源码篇之@Lookup详解
简介 Lookup注解可能平时开发中大家接触的少,但是又确实挺有用的,比如我们一个单例Bean注入了一个原型Bean,原型Bean的效果其实是会失效的,因为单例Bean一开始就实例化好了,后面也不会再变化,但我们可能需…...
2.5计划任务远程管理
2.5计划任务/远程管理 一、计划任务 1、计划任务概念解析 在Linux操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期 执行预先计划好的系统管理任务(如定期备份、定期采集监测数据)。RHEL6系统中…...
光伏、储能双层优化配置接入配电网研究(附带Matlab代码)
由于能源的日益匮乏,电力需求的不断增长等,配电网中分布式能源渗透率不断提高,且逐渐向主动配电网方向发展。此外,需求响应(demand response,DR)的加入对配电网的规划运行也带来了新的因素。因此,如何综合考…...
低代码服务商,中小型数字化软件服务商的新出路
数字化时代大背景下,企业信息化向数字化转型成为所有企业发展的必由之路,企业在对业务模式、流程、组织形式、信息技术等方面进行重新定义时,软件必然参与价值创造的全过程,这势必驱使软件成为推动数字化转型的“引擎”࿰…...
Arcgis 日常天坑问题2——三维场景不能不能加载kml图层,着手解决这个问题
arcgis js api官网介绍kml图层的地址: shttps://developers.arcgis.com/javascript/latest/api-reference/esri-layers-KMLLayer.html从文档里看到kml图层有诸多限制,比较重要的两点是: 1、不能在三维场景(SceneView࿰…...
Ubuntu22.04 交叉编译GCC13.2.0 for Rv1126
一、安装Ubuntu22.04 sudo apt install vim net-tools openssh-server 二、安装必要项 sudo apt update sudo apt upgrade sudo apt install build-essential gawk git texinfo bison flex 三、下载必备软件包 1.glibc https://ftp.gnu.org/gnu/glibc/glibc-2.38.tar.gz…...
什么是EVM?以太坊EVM合约交互
目录 什么是EVM? 为什么 EVM 很重要? 结论 虚拟机引擎 以太坊虚拟机...
Vue Treeselect el-tree-select 多选 只选中第三级
话不多说,直接看代码: <Treeselect v-model"scope.row.mdeptIds" :normalizernormalizer :defaultExpandLevel"2" :disable-branch-nodes"true" :multiple"true":append-to-body"true" :z-index"9999" style…...
Stable Diffusion专场公开课
从SD原理、本地部署到其二次开发 分享时间:11月25日14:00-17:00 分享大纲 从扩散模型DDPM起步理解SD背后原理 SD的本地部署:在自己电脑上快速搭建、快速出图如何基于SD快速做二次开发(以七月的AIGC模特生成系统为例) 分享人简介 July&#…...
【Typroa使用】Typroa+PicGo-Core(command line)+gitee免费图片上传配置
TyproaPicGo-Core(command line)gitee免费图片上传配置 本文是在win10系统下配置typroapicGo-Core(command line)gitee图片上传的教程。需要的环境和工具有: gitee账号,新建仓库及token令牌;已经安装了的typroa,需要0.9.98版本以上…...
【云原生-Kurbernetes篇】HPA 与 Rancher管理工具
文章目录 一、Pod的自动伸缩1.1 HPA1.1.1 简介1.1.2 HPA的实现原理1.1.3 相关命令 1.2 VPA1.2.1 简介1.2.2 VPA的组件1.2.3 VPA工作原理 1.3 metrics-server简介 二、 HPA的部署与测试2.1 部署metrics-serverStep1 编写metrics-server的配置清单文件Step2 部署Step3 测试kubect…...
Python学习笔记(4)
《Python编程:从入门到实践》学习笔记 1.文件和异常 1.1 从文件中读取数据 1.1.1 读取整个文件 要读取文件,需要一个包含几行文本的文件。下面首先来创建一个文件,它包含精确到小数 点后30位的圆周率值,且在小数点后每10位处都换…...
算法通关村第十二关-青铜挑战字符串
大家好我是苏麟 , 今天带来字符串专题 . 转换成小写字母 描述 : 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 题目 : LeetCode 709.转换成小写字母 : 709. 转换成小写字母 分析 : 这个题可以先遍历整个字符串…...
网站被反诈拦截该怎么申诉与解封
随着互联网的发展,网络诈骗问题也日益突出。为了打击这类问题,反诈中心采取了一系列的措施,如打击违规诈骗网站和APP,标记诈骗手机号等。虽然这些措施在一定程度上取得了效果,但是也不可避免会出现审核不到位的情况。 …...
【机器学习】033_反向传播
一、计算图、反向传播原理 1. 回顾前向传播 例:假设现在有一个神经网络,其仅有一个输出层和一个神经单元 定义 定义 ,即激活函数对激活值不再做具体处理 定义平方损失函数 ,计算a的值与真实值的差距 此时,通过计算…...
关于缓存和数据库一致性问题的深入研究
如何保证缓存和数据库一致性,这是一个老生常谈的话题了。 但很多人对这个问题,依旧有很多疑惑: 到底是更新缓存还是删缓存?到底选择先更新数据库,再删除缓存,还是先删除缓存,再更新数据库&…...
vim模式用法总结
0.前言 我们用gcc编译文件的时候,如果发生了下面的错误,那么如何用vim打开的时候就定位到? 我们可以知道,这是第6行出现了错误; 所以我们使用vim打开的时候多输入个这个,我们就可以快速定位了 vim test.c 6…...
基于深度学习的单帧图像超分辨率重建综述
论文标题:基于深度学习的单帧图像超分辨率重建综述作者: 吴 靖,叶晓晶,黄 峰,陈丽琼,王志锋,刘文犀发表日期:2022 年9 月阅读日期 :2023.11.18研究背景: 图像…...
开源与闭源:创新与安全的平衡
目录 一、开源和闭源的优劣势比较 一、开源软件的优劣势 优势 劣势 二、闭源软件的优劣势 优势 劣势 二、开源和闭源对大模型技术发展的影响 一、机器学习领域 二、自然语言处理领域 三、数据共享、算法创新与业务拓展的差异 三、开源与闭源的商业模式比较 一、盈…...
Taotoken模型广场如何帮助开发者快速选型与切换AI模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken模型广场如何帮助开发者快速选型与切换AI模型 面对市场上众多的大模型,开发者常常陷入选择困难。每个模型都有…...
别急着重装!利用Parallels快照对比法,快速定位Tools安装失败的根本原因
虚拟机快照对比法:精准定位Parallels Tools安装失败的终极指南 当Parallels Tools安装失败时,大多数用户的第一反应是重装系统或反复尝试安装。但有一种更高效的方法——利用虚拟机快照进行对比调试。这种方法不仅能快速定位问题根源,还能避免…...
2026届必备的降AI率神器解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于学术写作以及内容创作范畴之内,原创性具备相当关键的意义。降重网站作为一种起…...
物理世界数字孪生重构,镜像视界打造超大型港口全真镜像底座
副标题:无锚点自标定 厘米级空间反演,颠覆传统港口布控与定位模式在全球智慧港口升级的关键阶段,传统港口定位依赖GPS、人工锚点与标签基站,存在信号遮挡失准、部署成本高、维护难度大、动态目标追踪断链等痛点,已无法…...
避坑指南:在CentOS7上为TensorFlow2.6搭建Python3.8环境,我踩过的那些‘依赖’雷
CentOS7实战:Python3.8与TensorFlow2.6环境搭建的七大深坑与突围指南 当你在CentOS7上尝试为TensorFlow2.6搭建Python3.8环境时,系统会以各种依赖缺失、版本冲突的方式给你"惊喜"。这不是简单的yum install就能解决的问题,而是一场…...
CANN/PTO-ISA自定义算子示例
Custom PyTorch Operator (KERNEL_LAUNCH) Example 【免费下载链接】pto-isa Parallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platf…...
第三代社保卡全功能使用指南
文章目录社保卡代际区分(因省份而存在差异)第三代社保卡申领官方推广时间节点说明申领基础条件线下申领(支持即时制卡,当场拿卡)线上申领(邮寄到家/银行网点自取)第三代社保卡全功能指南基础社保…...
Falcon 7B混合分布式微调实战与优化策略
1. 混合分布式微调Falcon 7B的核心挑战当我们需要对Falcon 7B这种规模的模型进行微调时,单机显存容量很快会成为瓶颈。我最近在一个实际项目中尝试了混合分布式策略,将模型参数、优化器状态和数据样本同时进行切分,最终在8块A100上实现了接近…...
ExGRPO框架:强化学习中的动态经验重放优化
1. ExGRPO框架解析:平衡探索与经验重放的强化学习新范式在强化学习领域,样本效率一直是制约算法性能的关键瓶颈。特别是在大语言模型(LLM)的强化学习微调(RLHF)场景中,每个样本的获取成本可能高…...
CANN/ops-math赋值算子
Assign 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math 产品支持情况 产品是否支持 Ascend 950PR/Ascend 950DT √ Atlas A3 训练系列产品/Atlas A3 推理系列产…...
