《剑指offer》(6)其他算法

 先计算下三角,再遍历一次计算上三角。

class Solution:

    def multiply(self , A: List[int]) -> List[int]:

        #长度判断

        n = len(A)

        if n <= 1:

            return []

        B = [1]*n

        #计算乘矩阵的下三角,B中的每一个数都是A的前一个数和B的前一个数相乘

        for i in range(1,n):

            B[i] = B[i-1] * A[i-1]

        #计算乘矩阵的上三角,倒着数A,用变量存累乘

        temp = 1

        for i in range(n-1,-1,-1):

            B[i] *= temp 

            temp *= A[i] #累乘

        return B

class Solution:

    def FirstNotRepeatingChar(self , s: str) -> int:

        dict_s = {}

        #利用哈希表,第一次遍历后,将元素的数值统计

        for i in s:

            if i in dict_s:

                dict_s[i] += 1

            else:

                dict_s[i] = 1

#第二次遍历找到第一个值为1的下标输出

        for i in s:

            if dict_s[i] == 1:

                return s.index(i)

#否则返回-1

        return -1

 

class Solution:

    def replaceSpace(self , s: str) -> str:

        if len(s) == 0:

            return ''

        res = []

        for i in range(len(s)):

            if s[i] == ' ':

                res.append('%20')

            else:

                res.append(s[i])

        return ''.join(res)

 

class Solution:

    def reOrderArray(self , array: List[int]) -> List[int]:

        if len(array) == 0:

            return []

        a , b = [] ,[]

        for i in array:

            if i % 2 == 0:

                b.append(i)

            else:

                a.append(i)

        return a+b

class Solution:

    def MoreThanHalfNum_Solution(self , numbers: List[int]) -> int:

        dict_m = {}

        for i in numbers:

            if i in dict_m:

                dict_m[i] += 1

            else:

                dict_m[i] = 1

        n = len(numbers)

        res = [i[0] for i in dict_m.items() if i[1] > (n//2)]

        return res[0]

class Solution:

    def reOrderArrayTwo(self , array: List[int]) -> List[int]:

        #用两个指针一个是奇数开始的地方,一个是偶数开始的地方。

        n = len(array)

        if n == 0:

            return []

        start = 0 #偶数开始的位置

        for i in array:

            if i % 2 != 0:

                start += 1

        i = 0

        while i < n and start < n:

            if array[i] % 2 == 0 and array[start] % 2 != 0: #如果是奇偶就互换

                array[i], array[start] = array[start], array[i]

                start += 1

                i += 1

            elif array[i] % 2 == 0 and array[start] % 2 == 0: #都是偶数就移动start

                start += 1

            else: #否则就移动i

                i += 1

        return array

class Solution:

    def printNumbers(self , n: int) -> List[int]:

        if n == 0:

            return []

        s = 1

        #从1开始连乘10或者直接用次方计算10^n

        for i in range(n):

            s *= 10

        res = []

        #从1开始遍历到10^n-1

        for i in range(1,s):

            res.append(i)

        return res

class Solution:

    def PrintMinNumber(self , numbers: List[int]) -> str:

        import functools

        #判断长度

        if len(numbers) == 0:

            return ''

        #将整型数组转换成字符串数组

        number = list(map(str,numbers))

        #定义特定的排序规则

        camp = lambda a,b: 1 if a+b > b+a else -1

        #用定义的排序规则对字符串进行排序

        number = sorted(number,key = functools.cmp_to_key(camp))

        # number.sort(key=functools.cmp_to_key(camp))

        #拼接输出

        return ''.join(number)

class Solution:

    def FindContinuousSequence(self , s: int) -> List[List[int]]:

        #用两个指针,先从1开始加,如果加到大于等于后,判断是等于就存答案,大于就移动start继续重新加

        if s == 0:

            return []

        num = [i for i in range(1,s+1)]

        start = 1

        res = []

        while start < s:

            end = start

            val = 0

            while end < s and val < s:

                val += end

                end += 1

            if val == s: #存答案

                res.append(num[start-1:end-1])

                start += 1

            else: #重新加

                start += 1

        return res

 

class Solution:

    def FindNumbersWithSum(self , array: List[int], s: int) -> List[int]:

        # 左右指针

        if len(array) == 0:

            return []

        left = 0

        right = len(array) - 1

        while left < right:

            val = array[left] + array[right]

            if val > s:

                right -= 1

            elif val < s:

                left += 1

            else:

                return [array[left],array[right]]

        return []

class Solution:

    def LeftRotateString(self , s: str, n: int) -> str:

        #判断长度

        if len(s) == 0 or n == 0:

            return s

        length = len(s)

        n =  n % length #剔除循环到原字符串的次数,取余数

        for i in range(n):

            s += s[i]

        s = s[n:]

        return s

class Solution:

    def LastRemaining_Solution(self , n: int, m: int) -> int:

        #用两个指针,index来做循环,out来控制出列数

        res = [i for i in range(n)]

        index = 0 #从0开始数数

        out = 0

        while len(res) > 1:

            if index > len(res)-1: #查看是否需要循环数组

                index = 0  

            if out == m-1: #确定出列数

                res.pop(index)

                out = 0

                if index > len(res) - 1: #如果当前出列后,index已经大于数组长度,就循环数组

                    index = 0

            index += 1

            out += 1

        return res[0]

class Solution:

    #存储字符流和字符出现的次数

    s = []

    dict_s = {}

    #遍历字符流并且找到第一个为1的字符并且return

    def FirstAppearingOnce(self):

        for c in self.s:

            if self.dict_s[c] == 1:

                return c

        return '#'

    #插入时,一边插入字符流,一边统计数值

    def Insert(self, char):

        self.s.append(char)

        if char in self.dict_s:

            self.dict_s[char] += 1

        else:

            self.dict_s[char] = 1

动态规划:如果绳子只有2,那么不分开(2)比分开(1*1)大,3同理。也就是说绳子会有一个不可分割的长度j,在这个长度下,不分开会比分开更好。假设长度为i的绳子的不可分割长度是j,那么此时的最大乘积是dp[i]  = max(dp[i], j*dp[i-j]) 初始化dp,前面四个数是1,2,3,4

class Solution:

    def cutRope(self , n: int) -> int:

        # 动态规划

        #检查当数组长度小于等于3的时候直接算:

        if n <= 3:

            return n-1

        #初始化前4个乘积

        dp = [1]*(n+1)

        dp[1],dp[2],dp[3],dp[4] = 1,2,3,4 #跳过0

        #遍历长度,对于每一个长度i,最大值是当前长度或者(不可分的j)*dp[i-j]

        for i in range(5,n+1):

            for j in range(1,i):

                dp[i] = max(dp[i],j*dp[i-j])

        # 返回数组最后一位就是答案

        return dp[-1]

 数学计算:要使乘积最大,要尽可能的相等的将绳子分开。假设绳子分成m段,每段长度是x,

n = m*x, 最大乘积是x^m, m=n/x , 所以最大乘积是x^(n/x) ,将常数n提出,最大乘积是x^(1/x)

 但是由于数据量巨大,所以求幂需要重新实现,否则会超时。

把一个数a乘n次,按照二分的思想,将n不断除以2,如果是偶数,就累乘a = a*a ,如果是奇数,就将当前的a和结果相乘。直到n为0.(所以每次循环a不是一个一个乘上去的,是直接2的指数级乘上去的)

class Solution:

    def pow(self,a,n):

        MOD = 998244353 #值太大需要取模

        ans = 1

        while n>0:

            if n%2 == 1:

                ans = (ans*a)%MOD

            a  =(a*a)%MOD

            n = n // 2 #不断分割n

        return ans

    def cutRope(self , number: int) -> int:

        #不超3的直接结算

        if number <= 3:

            return number - 1

        #能整除3

        if number % 3 == 0:

            n = self.pow(3,(number//3))

            return n

        #最后剩余1,就拆掉一个分组,变成2*2

        elif number % 3 == 1:

            n = self.pow(3,number//3-1)

            return 4*n %998244353 #最后数太大要取模

        #剩余一个2就直接乘

        else:

            n = self.pow(3,number//3)

            return 2*n %998244353 #最后数太大要取模

丑数 = 已有的丑数 * (2,3,5) 得到三个新的丑数,但是新的丑数位置不一定正确,而且可能会有重复 。用p2,p3,p5三个指针,分别指向当前2,3,5因子得到的最大丑数。每次取这几个丑数中的最小值。使用一次质因子,就把相应的指针向前移动。(相当于每次都是最小的丑数的基础上形成下一个丑数,保证了递增)

class Solution:

    def GetUglyNumber_Solution(self , index: int) -> int:

        if index <= 0:

            return 0

        uglylist = [1]

        p2,p3,p5 = 0,0,0

        for i in range(index-1): #因为1已经在数组中,只需要再要后面的index-1

            new = min(uglylist[p2]*2,uglylist[p3]*3,uglylist[p5]*5)

            uglylist.append(new)

            if new % 2 == 0:

                p2 += 1

            if new % 3 == 0:

                p3 += 1

            if new % 5 == 0:

                p5 += 1

        return uglylist[-1]

 #数学找规律(不会找就背下来)

class Solution:

    def NumberOf1Between1AndN_Solution(self, n):

        #分成三种情况,把一个数字分成high + cur + low

        #cur = 0时,则当前位出现1的情况是hight*位数;cur=1,当前位出现1的情况是high*位数+low+1

        #cur>1时,当前位出现1的情况是(high+1)*10

        count = 0

        i = 1

        while i < n+1:

            high = n // (i*10)

            low = n % i

            cur = (n // i) % 10

            if cur == 0:

                count += high*i

            elif cur == 1:

                count += high*i +low + 1

            else:

                count += (high+1)*i

            i *= 10

        return count

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统中的自旋锁(两幅图清晰说明)

总结&#xff1a; 多CPU下的自旋锁采取的是忙等待&#xff08;原地打转&#xff09;机制&#xff0c;虽然忙等待的线程占用了它所在的cpu&#xff0c;但其他线程仍可放到其他CPU上执行。所以自旋锁上锁和解锁之间的临界区代码要尽量的短&#xff0c;最好不要超过5行&#xff0c…

【Linux拓展】ncurses库的安装和使用 {ncurses库的安装方法,ncurses库的使用手册,基于终端的贪吃蛇游戏}

一、简介 ncurses库是一个用于创建基于终端的交互式应用程序的库。它提供了一套API&#xff0c;用于处理终端界面的输入和输出&#xff0c;以及控制终端的光标位置、颜色、窗口等。 使用ncurses库&#xff0c;您可以在终端中创建复杂的文本界面&#xff0c;包括窗口、菜单、按…

能化校对软件:提高招标文件质量的创新解决方案

智能化校对软件是一种创新的解决方案&#xff0c;可以进一步提高招标文件的质量和准确性。 以下是一些智能化校对软件的创新功能和优势&#xff1a; 1.自然语言处理(NLP)技术&#xff1a;智能化校对软件利用NLP技术来理解和分析文本&#xff0c;识别和纠正更复杂的语法和语义错…

chapter14:springboot与安全

Spring Boot与安全视频 Spring Security, shiro等安全框架。主要功能是”认证“和”授权“&#xff0c;或者说是访问控制。 认证&#xff08;Authentication&#xff09;是建立在一个声明主体的过程&#xff08;一个主体一般指用户&#xff0c;设备或一些可以在你的应用程序中…

集合工具类 Collections:提升集合操作效率

文章目录 多元素添加&#xff1a;addAll 方法随机置换&#xff1a;shuffle 方法自定义对象排序&#xff1a;sort 方法总结 在Java的集合框架中&#xff0c;Collections 是一个包含了许多操作集合的静态方法的工具类。通过使用 Collections 类提供的方法&#xff0c;我们能够更加…

利用 3D 地理空间数据实现Cesium的沉浸式环境

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 为了将大量异构 3D 地理空间数据处理和分散到各行各业的地理空间应用程序和运行时引擎&#xff0c;Cesium 创建了 3D Tiles&#xff0c;这是一种用于高效流式传输和渲染大量异构数据集的开放标准。3D Tile…

CEC2013(MATLAB):淘金优化算法GRO求解CEC2013的28个函数

一、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;提…

尚硅谷大数据项目《在线教育之采集系统》笔记004

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P047 P048 P049 P050 P051 P052 P053 P054 P055 P056 P047 /opt/module/datax/job/base_province.json [atguigunode001 ~]$ hadoop fs -mkdir /base_province/2022-02-22 [atgu…

干货 | 详述 Elasticsearch 向量检索发展史

1. 引言 向量检索已经成为现代搜索和推荐系统的核心组件。 通过将复杂的对象&#xff08;例如文本、图像或声音&#xff09;转换为数值向量&#xff0c;并在多维空间中进行相似性搜索&#xff0c;它能够实现高效的查询匹配和推荐。 图片来自&#xff1a;向量数据库技术鉴赏【上…

Hugging Face 的文本生成和大语言模型的开源生态

[更新于 2023 年 7 月 23 日: 添加 Llama 2。] 文本生成和对话技术已经出现多年了。早期的挑战在于通过设置参数和分辨偏差&#xff0c;同时控制好文本忠实性和多样性。更忠实的输出一般更缺少创造性&#xff0c;并且和原始训练数据更加接近&#xff0c;也更不像人话。最近的研…

c51单片机16个按键密码锁源代码(富proteus电路图)

注意了&#xff1a;这个代码你是没法直接运行的&#xff0c;但是如果你看得懂&#xff0c;随便改一改不超过1分钟就可以用 #include "reg51.h" #include "myheader.h" void displayNumber(unsigned char num) {if(num1){P10XFF;P10P11P14P15P160;}else if…

论文讲解——TPU-MLIR: A Compiler For TPU Using MLIR

论文讲解——TPU-MLIR: A Compiler For TPU Using MLIR https://arxiv.org/pdf/2210.15016.pdf概览模型转换TranslationCanonicalizeLoweringLayerGroup BufferizationCalibration QuantizationCorrectness Check相关资料 https://arxiv.org/pdf/2210.15016.pdf 本文将对TPU…

vue3 动态导入src/page目录下的所有子文件,并自动注册所有页面组件

main.js添加一下代码&#xff1a; const importAll (modules) > {Object.keys(modules).forEach((key) > {const component key.replace(/src/, /).replace(.vue, );const componentName key.split(/).slice(-2, -1)[0] -page;app.component(componentName, modules…

RocketMQ 5.x如何使用GRPC方式发送消费消息

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 RocketMQ版本 5.1.0 背景 我们都知道RocketMQ 5.x新增了proxy模式部署方式&#xff0c;也就是支持了GRPC的消费方式消费&#xff0c;所以今天我们来试试 本次…

php通过各种函数判断0和空php实例

php通过各种函数判断0和空php实例 本文给大家介绍php同各种函数判断0和空的方法&#xff0c;在文章给大家补充介绍了php 语法里0不等于null为空的解决办法 补充&#xff1a;下面给大家介绍下php 语法里0不等于null为空的解决办法 今天遇到这样一个问题是这样的: php 语句里,我…

Nevron Diagram for .NET Crack

Nevron Diagram for .NET Crack Nevron Diagram for.NET可帮助您快速轻松地在.NET Windows窗体和ASP.NET应用程序中集成和显示复杂的图表。这是一个完整的绘图解决方案&#xff0c;包含许多交互功能、形状、自动布局和令人惊叹的视觉效果&#xff0c;并配备了现成的控件&#x…

Linux常规操作命令

日升时奋斗&#xff0c;日落时自省 目录 1、vim 1.1、工作模式 1.2、末行模式操作相关命令 1.2.1、保存退出操作 1.2.2、查找替换 1.3、输入模式操作相关命令 1.3.1、移动相关命令 1.3.2、删除和剪切命令 1.3.3、复制操作 1.3.4、撤销 2、head 3、tail 4、ps 5、…

策略模式【Strategy Pattern】

刘备要到江东娶老婆了&#xff0c;走之前诸葛亮给赵云&#xff08;伴郎&#xff09;三个锦囊妙计&#xff0c;说是按天机拆开解决棘手问题&#xff0c; 嘿&#xff0c;还别说&#xff0c;真是解决了大问题&#xff0c;搞到最后是周瑜陪了夫人又折兵呀&#xff0c;那咱们先看看…

爬虫学习记录(持续更新)

一、问题记录 1.使用webdriver报错AttributeError: str object has no attribute capabilities 解决&#xff1a;目前使用的selenium版本是4.11.2&#xff0c;可以不必设置driver.exe的路径&#xff0c;selenium可以自己处理浏览器和驱动程序&#xff0c;因此&#xff0c;使用…

Shopify平台Fulfillment业务模块升级

上图是销售订单、发货单与配送之间的关系图&#xff0c;销售订单可以创建多个发货单&#xff0c;多个发货单(不同销售订单)可以合并在一个配送订单进行发货 接口请求错误记录: 1. The api_client does not have the required permission(s). 2. Required parameter missing or…