力扣题目学习笔记(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;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/155024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux网络】搭建内外网的网关服务器,实现DNS分离解析与DHCP自动分配

一、实验要求&#xff1a; 二、实验思路剖析&#xff1a; 网关服务器&#xff1a; 客户端准备&#xff1a; 实操&#xff1a; 第一步先安装dhcp服务和bind服务 第二步双网卡&#xff0c;配置网卡的ip地址 第三步&#xff1a;开始配置dhcp 第四步&#xff1a;做dns分离解析…

使用项目自动生成的dokcerfile第一次构建时把加载aps5.0失败无法找到加载的文件

第一次构建初始化项目自带的dockerfile,内容如下: #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.#FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base #WORKDIR /a…

【half done】剑指offer53:在排序数组中查找数字

力扣&#xff0c;https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/description/ 二分查找&#xff0c;边界问题 solution1 自己的方法&#xff0c;其实不太好 class Solution {public int countTarget(int[] scores, int target) {if (scores.l…

单线圈无刷直流电机的电机驱动器芯片GC1298R/S,可替代EUM6898/德信,应用于车用信息娱,HUD 投影仪调整等产品中

GC1298R/S 是单线圈无刷直流电机的电机驱动器。它具有高效的直接 PWM控制方式&#xff0c; 它可以控制无刷直流电机转速。它集成了最低速 度限制模式、可调速度斜率控制模式、软启动模 式、风扇转速计、锁保护、自动重启、TSD、OCP 和噪声控制模式&#xff0c;噪声控制模式根据…

使用持久卷部署 WordPress 和 MySQL

&#x1f5d3;️实验环境 OS名称Microsoft Windows 11 家庭中文版系统类型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 &#x1f587;️创建 kustomization.yaml 你可以通过 kustomization.yaml 中的生成器创建一个 Secret存储密码或密…

python 迭代器

可迭代对象 可以直接作用于for循环的对象统称为可迭代对象 &#xff08;iterable&#xff09;。可以用isinstance()去判断一个对象是否是iterable对象。 数据类型 可以直接作用于for循环的数据类型一般分为两种 1.集合数据类型&#xff0c;如list、tuple、dict、set、strin…

使用Arrays.asList与不使用的区别

在写算法的时候&#xff0c;遇到了有的题解使用的是Arrays.asList&#xff0c;也有的是直接新建一个List集合将元素加进去的。 看了一下算法的时间&#xff0c;两者居然相差了9秒。 算法原地址&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长…

类和对象学习笔记

类和对象 类的定义this指针类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载赋值运算符重载运算符重载const成员 取地址操作符重载const取地址操作符重载 初始化列表explicit关键字static成员匿名对象友元内部类拷贝对象时编译器的优化 类的定义 c类的定义形式…

使用SpringBoot开发一个API网关

已经有很多开源的网关了&#xff0c;而且大公司一般都有自己的网关系统&#xff0c;但是有些场景也离不开我们自己需求定制&#xff0c;可以使用SpringCloud GateWay来满足我们业务的需求&#xff0c;即使需要在网关层实现一些具体的业务逻辑&#xff0c;我们也可以在开源的基础…

基于Bagging集成学习方法的情绪分类预测模型研究(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

电脑监控软件解读

电脑监控软件是这信息化时代下的产物&#xff0c;随着计算机在生活、学习和工作中的普及&#xff0c;管理和保护计算机数据安全变得越来越重要。电脑监控软件应时而生&#xff0c;能够帮助用户更好地管理计算机使用&#xff0c;从而达到保护数据安全&#xff0c;和提高工作效率…

如何判断一个公司是否为空壳公司

什么是空壳公司&#xff1f; “空壳公司”也叫现成公司&#xff08;readymade company&#xff09;。最早是根据英国公司法确立的一种公司法律形式。是发起人根据香港或英国的法律成立的有限公司&#xff0c;但是没有任命第一任董事&#xff0c;也没有投资者认购股份&#xff…

【每日OJ —— 232.用栈实现队列(栈)】

每日OJ —— 232.用栈实现队列&#xff08;栈&#xff09; 1.题目&#xff1a;232.用栈实现队列&#xff08;栈&#xff09;2.解法2.1.方法讲解2.1.1.算法讲解2.1.2.代码实现2.1.3.提交通过展示 1.题目&#xff1a;232.用栈实现队列&#xff08;栈&#xff09; 2.解法 2.1.方法…

windows上 adb devices有设备 wsl上没有

终于解决了&#xff01;&#xff01;&#xff01;&#xff01; TAT&#xff0c;尝试了很多种办法。 比如WSL中的adb和Windows中的adb版本必须一致&#xff0c;一致也没用&#xff0c;比如使用 ln 建立链接也没用。 这个解决办法的前提是windows中的abd是好用的。 ●在windows…

简单php反序列化实现执行代码

简单php反序列化实现执行代码 反序列化举例 首先定义类和对象&#xff0c;然后输出序列化和反序列化结果看看这是个什么东西 <?phpclass Stu{public $name;public $age;public $sex;public $score;}$stu1 new Stu();$stu1->name "order";$stu1->age …

部署Kubernetes Dashboard

Dashboard简介 Dashboard 是基于网页的 Kubernetes 用户界面。 可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 Dashboard创建 #创建pods kubectl apply -f https://raw.githubusercontent.com/kub…

北邮22级信通院数电:Verilog-FPGA(10)第十周实验 实现移位寄存器74LS595(仿真方法验证)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 使用FPGA开发板验证的教程&#xff0c;请参考 北邮…

el-tabs首次进入左边缺失边距解决办法

目前发现是UI渲染的问题&#xff0c;页面首次加载el-tabs__nav-wrap和el-tabs__nav-scroll的左边距莫名丢失&#xff0c;页面跳转走再跳转回来页面就恢复正常了&#xff0c;要想初始时候就正常可以添加下列css代码 .el-tabs__nav-wrap, .el-tabs__nav-scroll{margin-left: 20…

MySql分区

一、什么是分区 MySQL分区是一种数据库设计和管理技术&#xff0c;它允许你将表分割成独立的、具有特定规则的存储单元。每个分区可以独立地进行管理&#xff0c;包括备份、恢复和优化。分区的主要目的是提高查询性能、简化维护以及实现数据的更有效管理。 以下是MySQL分区的…

linux控制台命令

进入root sudo su root 浏览当前文件夹列表 ll ls 查看文件 vim test.txt :q 退出查看模式 上传 sudo rz rz 覆盖上传 rz -y 修改文件名&#xff1a; mv 旧文件名 新文件名 修改文件权限 sudo chmod ar xxx.txt sudo chmod 777 test.txt 7 4 2 1 读写运行权限…