Python解力扣算法题(六)(详解+注释)

# 1.学校打算为全体学生拍一张年度纪念照。根据要求,学生需要按照 非递减 的高度顺序排成一行。
# 排序后的高度情况用整数数组 expected 表示,其中 expected[i] 是预计排在这一行中第 i 位的学生的高度(下标从 0 开始)。
# 给你一个整数数组 heights ,表示 当前学生站位 的高度情况。heights[i] 是这一行中第 i 位学生的高度(下标从 0 开始)。
# 返回满足 heights[i] != expected[i] 的 下标数量 。
  1. heightChecker函数
    • 解释
      • 这个函数的目的是计算当前学生站位高度数组heights与按照非递减顺序排序后的高度数组中元素不相等的下标数量。
      • 首先,需要创建heights的副本pre_heights,因为直接使用pre_heights = heights只是创建了引用,对heights排序时pre_heights也会改变。这里使用切片pre_heights = heights[:]创建了副本。
      • 然后对heights进行排序,再通过遍历比较heightspre_heights中相同下标的元素,如果不相等则将计数变量count加1。最后返回count
def heightChecker(heights):# 创建heights的副本,这里使用切片操作pre_heights = heights[:]# 对heights进行排序heights.sort()count = 0for i in range(len(heights)):# 如果排序后的heights和原始的pre_heights在相同下标处元素不相等if heights[i]!= pre_heights[i]:count += 1return countprint(heightChecker([1, 1, 4, 2, 1, 3]))
# 2.复写0,列表长度不变
  1. duplicateZeros函数
    • 解释
      • 这个函数的目的是对输入的数组arr进行复写0的操作,即如果数组中的元素为0,则在该元素后面插入一个0,同时要保证数组长度不变。
      • 使用一个变量i来遍历数组arr,同时记录数组的长度length。在遍历过程中,如果i等于length,说明已经遍历到了原数组的末尾(因为插入操作可能会使数组变长),此时将数组截断为i个元素。如果当前元素为0,则在i + 1的位置插入一个0,并且将i加1(因为插入了一个元素),最后i加1继续下一轮遍历。最后返回处理后的数组arr
def duplicateZeros(arr):i = 0length = len(arr)while i < len(arr):# 如果i等于数组长度,说明已经到了原数组末尾(考虑插入后的情况)if i == length:arr = arr[:i]break# 如果当前元素为0,则在i+1位置插入一个0if arr[i] == 0:arr.insert(i + 1, 0)i += 1i += 1return arrprint(duplicateZeros([1, 0, 2, 3, 0, 4, 5, 0]))
# 3.求第N个泰波那契数   Tn+3=Tn+Tn+1+Tn+2
  1. tribonacci函数
    • 解释
      • 这个函数用于计算第n个泰波那契数。泰波那契数的定义是Tn+3=Tn+Tn+1+Tn+2,初始值为[0, 1, 1]
      • 首先创建一个包含初始值的数组arr = [0, 1, 1],然后通过循环n - 2次,每次将前三个数的和添加到数组中,最后返回数组中第n个元素。
def tribonacci(n):arr = [0, 1, 1]# 循环计算泰波那契数,从第3个开始for i in range(0, n - 2):arr.append(arr[i]+arr[i + 1]+arr[i + 2])return arr[n]print(tribonacci(25))
# 4.给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
# 输入为三个整数:day、month 和 year,分别表示日、月、年。
# 您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。# 为了解决这个问题,我们可以使用蔡勒公式(Zeller's Congruence),这是一个用于计算格里高利历(公历)中任意日期是星期几的有效算法。
# 其中:# h是星期几(0 = Saturday, 1 = Sunday, 2 = Monday, ..., 6 = Friday)# q是月份中的日(1to31)# m是月(3 = March, 4 = April, ..., 12 = December;1 = March, 2 = April, ..., 10 = December, 11 = January, 12 = February)# K是年份中的最后两位数# J是年份中的前两位数
# 由于蔡勒公式中的月份是从3月开始的,所以如果输入的月份是1月或2月,需要将月份加上12,并将年份减1。
# 注意:蔡勒公式适用于1583年(格里高利历改革的那一年)以后的日期。对于更早的日期,需要使用其他公式或历史日历规则。
  1. dayOfTheWeek函数
    • 解释
      • 这个函数使用蔡勒公式(Zeller's Congruence)来计算给定日期(daymonthyear)是星期几。
      • 由于蔡勒公式中的月份是从3月开始的,如果输入的月份是1月或2月,需要将月份加上12,并将年份减1。然后根据蔡勒公式计算出h(星期几的索引,0 = Saturday, 1 = Sunday, 2 = Monday,..., 6 = Friday),最后根据索引从星期的字符串数组days中返回对应的星期字符
def dayOfTheWeek(day, month, year):# 如果月份小于3,按照蔡勒公式的要求进行调整if month < 3:month += 12year -= 1q = daym = monthK = year % 100J = year // 100# 蔡勒公式计算星期几的索引hh = (q+(13*(m + 1))//5+K+K//4+J//4 - 2*J)%7days = ["Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]return days[h]print(dayOfTheWeek(day = 31, month = 8, year = 2019))
# 5.给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。
# 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。
  1. maxNumberOfBalloons函数
    • 解释
      • 这个函数用于计算给定字符串text中可以拼凑出单词“balloon”的最大数量。
      • 通过字典{'b': 1, 'a': 1, 'l': 2, 'o': 2, 'n': 1}定义了组成“balloon”每个字母的需求数量,然后使用字典推导式和min函数,计算每个字母在text中出现的次数除以需求数量的最小值,这个最小值就是可以拼凑出的最大单词数量。
def maxNumberOfBalloons(text):# 计算每个字母在text中的数量与组成balloon所需数量的比例的最小值return min(text.count(key)//val for key, val in {'b': 1, 'a': 1, 'l': 2, 'o': 2, 'n': 1}.items())print(maxNumberOfBalloons("loonbalxballpoon"))
# 6.给你个整数数组 arr,其中每个元素都 不相同。
# 请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。
# 每对元素对 [a,b] 如下:
# a , b 均为数组 arr 中的元素
# a < b
# b - a 等于 arr 中任意两个元素的最小绝对差
  1. minimumAbsDifference函数
    • 解释
      • 这个函数的目的是在给定的整数数组arr中找到所有具有最小绝对差的元素对,并按升序返回。
      • 首先对数组arr进行排序,然后初始化最小差值min_diff为数组中最大元素与最小元素的差值。接着遍历数组,计算相邻元素的差值diff,如果diff小于min_diff,则更新min_diff并重新初始化pairs为包含当前元素对的列表;如果diff等于min_diff,则将当前元素对添加到pairs中。最后返回pairs
def minimumAbsDifference(arr):arr.sort()# 先排序min_diff = arr[len(arr)-1]-arrpairs = []# 计算最小差值并找到对应的元素对for i in range(len(arr)-1):diff = arr[i + 1]-arr[i]if diff < min_diff:min_diff = diffpairs = [[arr[i], arr[i + 1]]]elif diff == min_diff:pairs.append([arr[i], arr[i + 1]])return pairsprint(minimumAbsDifference([4, 2, 1, 3]))
# 7.给你一个整数数组 arr,如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
  1. uniqueOccurrences函数
    • 解释
      • 这个函数用于判断整数数组arr中每个数的出现次数是否都是独一无二的。
      • 首先创建一个集合arr1,它包含数组arr中的所有不同元素。然后创建一个空列表list1,遍历arr1中的每个元素,计算其在arr中的出现次数并添加到list1中。对list1进行排序后,再遍历list1,如果有相邻元素相等,则返回False,否则返回True
def uniqueOccurrences(arr):arr1 = set(arr)list1 = []for i in arr1:list1.append(arr.count(i))list1.sort()for i in range(len(list1)-1):if list1[i] == list1[i + 1]:return Falsereturn Trueprint(uniqueOccurrences([1, 2]))
# 8. n 个筹码。第 i 个筹码的位置是 position[i] 。
# 我们需要把所有筹码移到同一个位置。在一步中,我们可以将第 i 个筹码的位置从 position[i] 改变为:
# position[i] + 2 或 position[i] - 2 ,此时 cost = 0
# position[i] + 1 或 position[i] - 1 ,此时 cost = 1
# 返回将所有筹码移动到同一位置上所需要的 最小代价 。
# 因为我们的目标是最后将全部的「筹码」移动到同一个位置,那么最后的位置只有两种情况:
# 移动到某一个偶数位置,此时的开销最小值就是初始奇数位置「筹码」的数量。
# 移动到某一个奇数位置,此时的开销最小值就是初始偶数位置「筹码」的数量。
# 那么这两种情况中的最小值就是最后将所有筹码移动到同一位置上所需要的最小代价。
  1. minCostToMoveChips函数
    • 解释
      • 这个函数的目的是计算将所有筹码移动到同一位置上所需要的最小代价。
      • 由于移动到某一个偶数位置的开销最小值就是初始奇数位置筹码的数量,移动到某一个奇数位置的开销最小值就是初始偶数位置筹码的数量,所以使用Counter统计数组position中元素模2后的余数的个数,最后返回余数为0和余数为1的个数中的最小值。
from collections import Counterdef minCostToMoveChips(position):cnt = Counter(p % 2 for p in position)return min(cnt, cnt[1])print(minCostToMoveChips([1, 2, 2, 2, 2, 3, 3]))
# 9.平衡字符串 中,'L' 和 'R' 字符的数量是相同的。
# 给你一个平衡字符串 s,请你将它分割成尽可能多的子字符串,并满足:
# 每个子字符串都是平衡字符串。
# 返回可以通过分割得到的平衡字符串的 最大数量 。
  1. balancedStringSplit函数
    • 解释
      • 这个函数用于将平衡字符串s(其中'L'和'R'字符的数量是相同的)分割成尽可能多的子字符串,且每个子字符串都是平衡字符串,返回可以得到的平衡字符串的最大数量。
      • 使用变量count来记录'R'和'L'字符数量的差值,ans用于记录平衡字符串的数量。遍历字符串s,如果遇到'R'则count加1,如果遇到'L'则count减1,当count等于0时,说明找到了一个平衡字符串,ans加1。最后返回ans
def balancedStringSplit(s):count = 0ans = 0for i in s:if i == "R":count += 1elif i == "L":count -= 1if count == 0:ans += 1return ansprint(balancedStringSplit("RLRRLLRLRL"))
# 10.数字的每一位相乘的积减去数字每一位相加的和的结果
  1. subtractProductAndSum函数
  • 解释
    • 这个函数用于计算数字n的每一位相乘的积减去数字每一位相加的和的结果。
    • 首先将数字n转换为字符串,然后初始化两个变量sum1为1(用于乘积)和sum2为0(用于求和),遍历字符串中的每个字符,将其转换为整数后分别进行乘积和求和操作,最后返回sum1 - sum2
def subtractProductAndSum(n):n = str(n)sum1 = 1sum2 = 0for i in range(len(n)):sum1 *= int(n[i])sum2 += int(n[i])return sum1 - sum2print(subtractProductAndSum(234))
# 11.给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
# 请你找到并返回这个整数
  1. findSpecialInteger函数
  • 解释
    • 这个函数用于在非递减的有序整数数组arr中找到出现次数超过数组元素总数的25%的那个整数。
    • 首先创建一个集合arr1,它包含数组arr中的所有不同元素。然后遍历arr1中的每个元素,计算其在arr中的出现次数与数组长度的比例,如果大于0.25,则返回该元素。
def findSpecialInteger(arr):arr1 = set(arr)for i in arr1:if arr.count(i)/len(arr)>0.25:return iprint(findSpecialInteger([1, 2, 2, 6, 6, 6, 6, 7, 10]))
# 12.给你一个整数数组 nums,请你返回其中位数为 偶数 的数字的个数。
  1. findNumbers函数
  • 解释
    • 这个函数用于返回整数数组nums中位数为偶数的数字的个数。
    • 遍历数组nums中的每个元素,将其转换为字符串,如果字符串的长度为偶数,则将计数变量double加1,最后返回double
def findNumbers(nums):double = 0for i in nums:i = str(i)if len(i)%2 == 0:double += 1return doubleprint(findNumbers([555, 901, 482, 1771]))
# 13.给你一个以行程长度编码压缩的整数列表 nums 。
# 考虑每对相邻的两个元素 [freq, val] = [nums[2*i], nums[2*i+1]] (其中 i >= 0 ),
# 每一对都表示解压后子列表中有 freq 个值为 val 的元素,你需要从左到右连接所有子列表以生成解压后的列表。
  • 解释
    • 这个函数的目的是对以行程长度编码压缩的整数列表nums进行解压。行程长度编码的规则是每对相邻的两个元素[freq, val] = [nums[2*i], nums[2*i + 1]](其中i >= 0)表示解压后子列表中有freq个值为val的元素,需要从左到右连接所有子列表以生成解压后的列表。
    • 通过遍历nums列表,当索引i为奇数时(因为行程长度编码是成对的,偶数位置是频率,奇数位置是值),根据前面偶数位置(i - 1)表示的频率,将当前奇数位置的值重复添加到结果列表list1中。最后返回list1
def decompressRLElist(nums):list1 = []for i in range(len(nums)):if i % 2 == 1:# 根据前面偶数位置的频率,将当前奇数位置的值重复添加到结果列表for j in range(nums[i - 1]):list1.append(nums[i])return list1print(decompressRLElist([1, 2, 3, 4]))
# 14.给你一个仅由数字 6 和 9 组成的正整数 num。
# 你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。
# 请返回你可以得到的最大数字。
  1. maximum69Number函数
  • 解释
    • 这个函数用于在仅由数字6和9组成的正整数num中,最多翻转一位数字(将6变成9,或者把9变成6)以得到最大数字。
    • 首先将数字num转换为字符串,再转换为列表,这样就可以修改其中的字符。然后从左到右遍历这个列表,如果遇到数字6,将其变为9后直接返回转换回整数后的结果(因为要得到最大数字,所以遇到6就变9后返回即可)。如果没有遇到6,说明数字本身就是最大的情况,直接将列表转换回整数并返回。
def maximum69Number (num):num = str(num)num = list(num)for i in range(len(num)):if num[i] == "6":num[i] = "9"return int(''.join(num))return int(''.join(num))print(maximum69Number(9996))
# 15.给你一个字符串 s,它仅由字母 'a' 和 'b' 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。
# 返回删除给定字符串中所有字符(字符串为空)的最小删除次数。
# 「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。
# 「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。
  1. removePalindromeSub函数
  • 解释
    • 这个函数用于计算删除仅由字母'a'和'b'组成的字符串s中所有字符(使字符串为空)的最小删除次数。
    • 因为字符串只由'a'和'b'组成,并且每次可以删除一个回文子序列。如果字符串本身就是回文串,那么只需要删除一次就可以使字符串为空;如果字符串不是回文串,那么最多需要两次,一次删除所有的'a'(这是一个回文子序列),一次删除所有的'b'(这也是一个回文子序列)。通过判断字符串是否等于其逆序字符串来确定是否为回文串,然后返回相应的结果。
def removePalindromeSub(s):return 1 if s == s[::-1] else 2print(removePalindromeSub("aaabbb"))

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

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

相关文章

mac单独打开QT帮助文档助手

mac单独打开QT帮助文档助手 1.概述 windows和mac查看QT帮助文档的路径不同&#xff0c;下面给出两个系统的查找路径。 Windows 下&#xff1a; C:\Qt\Qt5.9.9\5.9.9\mingw49_32\bin\assistant.exeMac 下&#xff1a; /Users/apple/Qt5.9.9/5.9.9/clang_64/bin/Assistant2.使…

SSLHandshakeException错误解决方案

1、错误提示 调用Http工具报如下异常信息&#xff1a; cn.hutool.core.io.IORuntimeException: SSLHandshakeException: Received fatal alert: handshake_failure2、查询问题 一开始我以为是代码bug&#xff0c;网络bug甚至是配置环境未生效&#xff0c;找了一大圈&#xf…

海量数据迁移:Elasticsearch到OpenSearch的无缝迁移策略与实践

文章目录 一&#xff0e;迁移背景二&#xff0e;迁移分析三&#xff0e;方案制定3.1 使用工具迁移3.2 脚本迁移 四&#xff0e;方案建议 一&#xff0e;迁移背景 目前有两个es集群&#xff0c;版本为5.2.2和7.16.0&#xff0c;总数据量为700T。迁移过程需要不停服务迁移&#…

【IEEE出版】第六届国际科技创新学术交流大会暨信息技术与计算机应用学术会议(ITCA 2024,12月06-08)

第六届国际科技创新学术交流大会暨信息技术与计算机应用学术会议&#xff08;ITCA 2024) 2024 6th International Conference on Information Technology and Computer Application 会议官网&#xff1a;itca2024.iaecst.org 会议时间&#xff1a;2024年12月06-08日 截稿时…

Charles抓包_Android

1.下载地址 2.破解方法 3.安卓调试办法 查看官方文档&#xff0c;Android N之后抓包要声明App可用User目录下的CA证书 3.1.在Proxy下进行以下设置&#xff08;路径Proxy->Proxy Settings&#xff09; 3.1.1.不抓包Windows&#xff0c;即不勾选此项&#xff0c;免得打输出不…

研究大语言模型在心理保健智能顾问的有效性和挑战

概述 心理保健是现代社会一个日益严重的问题。例如&#xff0c;在日本&#xff0c;自杀是 10-39 岁人群的首要死因。此外&#xff0c;根据世界卫生组织&#xff08;WHO&#xff09;的数据&#xff0c;自杀是全球年轻人的首要死因。在此背景下&#xff0c;通过短信应用程序提供…

海外媒体发稿:国外媒体通稿PR发布-提升品牌影响力的绝佳选择

大舍传媒 在当今全球化的商业环境中&#xff0c;海外媒体发稿已经成为企业拓展国际市场、提升品牌知名度的重要手段。特别是在沙特这样的中东地区&#xff0c;通过在当地知名的汽车垂直媒体上发布新闻通稿PR&#xff0c;能够为您的品牌带来前所未有的曝光和机遇。 今天&#…

ctfshow(162)--文件上传漏洞--远程文件包含

Web162 进入界面&#xff1a; 思路 先传个文件测试一下过滤&#xff1a; 过滤了特别多符号&#xff0c;注意过滤了点. 我们的思路还是要先上传.user.ini文件: //修改前 GIF89a auto_prepend_fileshell.png//由于过滤了点&#xff0c;所以修改为 GIF89a auto_prepend_file…

学习threejs,导入COLLADA(.DAE)格式的模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.ColladaLoader DAE模…

HTB:PermX[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many TCP ports are listening on PermX? 使用nmap对靶机TCP端口进行开放扫描 2.What is the default domain name used by the web server on the box? 使用curl访问靶机80端口 3.On what subdomain of permx.htb is there an o…

Imperva 数据库与安全解决方案

Imperva是网络安全解决方案的专业提供商&#xff0c;能够在云端和本地对业务关键数据和应用程序提供保护。公司成立于 2002 年&#xff0c;拥有稳定的发展和成功历史并于 2014 年实现产值1.64亿美元&#xff0c;公司的3700多位客户及300个合作伙伴分布于全球各地的90多个国家。…

python验证码滑块图像识别

文章目录 1、案例图片1、需求说明2、代码实现总结 1、案例图片 1、需求说明 python 3.10,写一个滑块验证码的自动化程序。需要一个opencv的函数&#xff0c;能准确的计算&#xff0c;在这同一张图片上&#xff0c;滑块形状和缺口形状的坐标位置及两个形状之间在X轴上的距离。请…

「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List 和 Grid 组件展示数据列表

List 和 Grid 是鸿蒙开发中的核心组件&#xff0c;用于展示动态数据。List 适合展示垂直或水平排列的数据列表&#xff0c;而 Grid 则适用于展示商品或图片的网格布局。本篇将展示如何封装组件&#xff0c;并通过按钮实现布局切换&#xff0c;提升界面的灵活性和用户体验。 关键…

「Mac畅玩鸿蒙与硬件25」UI互动应用篇2 - 计时器应用实现

本篇将带领你实现一个实用的计时器应用&#xff0c;用户可以启动、暂停或重置计时器。该项目将涉及时间控制、状态管理以及按钮交互&#xff0c;是掌握鸿蒙应用开发的重要步骤。 关键词 UI互动应用时间控制状态管理用户交互 一、功能说明 在这个计时器应用中&#xff0c;用户…

群控系统服务端开发模式-应用开发-上传工厂开发

现在的文件、图片等上传基本都在使用oss存储。而现在常用的oss存储有阿里云、腾讯云、七牛云、华为云等&#xff0c;但是用的最多的还是前三种。而我主要封装的是本地存储、阿里云存储、腾讯云存储、七牛云存储。废话不多说&#xff0c;直接上传设计图及说明&#xff0c;就一目…

Hadoop生态圈框架部署(五)- Zookeeper完全分布式部署

文章目录 前言一、Zookeeper完全分布式部署&#xff08;手动部署&#xff09;1. 下载Zookeeper2. 上传安装包2. 解压zookeeper安装包3. 配置zookeeper配置文件3.1 创建 zoo.cfg 配置文件3.2 修改 zoo.cfg 配置文件3.3 创建数据持久化目录并创建myid文件 4. 虚拟机hadoop2安装并…

UI设计师们,AI留给你们的窗口期没多少了得亏生成的模型不能编辑

对于 UI 设计师们来说&#xff0c;AI 的发展确实带来了一定的挑战。 虽然目前生成的模型不能编辑&#xff0c;但谁也无法确定未来的发展走向。 然而&#xff0c;设计师们也不必过分担忧。人类的创造力、审美能力和对用户需求的深刻理解是无法被轻易取代的。 设计师可以利用这…

Gerrit 2.12.2 window版本部署

背景&#xff1a;原有gerritgit服务器一套&#xff08;以下称老gerrit&#xff09;&#xff0c;现在需要在备份机器上面也搭建一套gerrit(以下称新gerrit)。 目前老gerrit服务器信息为&#xff1a;centos gerrit 2.12.2jdk1.8mysql5.1.73nginx 新gerrit服务器信息为&#xf…

一文搞懂Linux kernel编译步骤

一、前言 什么是Linux的内核编译呢&#xff1f;简单来说&#xff0c;Linux内核编译是一个将内核源代码转换成可在特定的硬件架构上运行的二进制文件的过程。通过编译内核&#xff0c;我们可以根据自己的需求和兴趣对内核进行定制和优化&#xff0c;以满足特定的应用场景。下文…

CST汽车天线仿真(双向混合求解)

CST从2018版本开始具有双向混合求解&#xff0c;到2019版已经通用微波工作室的各个求解器之间的双向混合。具体的混合对象如下图&#xff1a; 对天线的安装和耦合仿真&#xff0c;意味着对复杂结构&#xff08;天线&#xff09;和电大尺寸环境&#xff08;安装平台&#xff0c;…