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

news2024/12/26 11:19:23

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

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

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

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

相关文章

“可一学院”区块链学习平台正式启动,助力BSV技术普及与传播

2023年8月8日&#xff0c;上海可一澈科技有限公司&#xff08;以下简称“可一科技”&#xff09; 正式发布区块链学习平台“可一学院”。“可一学院” 立足于BSV区块链技术本源&#xff0c;汇集了多层次的专业课程和学习资源&#xff0c;致力于打造一个适合各类人群使用的一站式…

MobaXterm 中文乱码, 及pojie

中文解决方法&#xff1a; 把“连字”去掉&#xff01; MobaXterm网页&#xff0c;可以生成一个授权文件Custom.mxtpro。放在安装目录就可以了 MobaXterm Keygen (husbin.top)http://b70.husbin.top:5000/

VS+Qt+C++旅游景区地图导航源码实例

程序示例精选 VSQtC旅游景区地图导航 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<VSQtC旅游景区地图导航>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。…

药库管理指南:除了药物质量,这个技能很关键

随着医疗技术的不断进步&#xff0c;药品的质量要求也日益严格&#xff0c;药物的稳定性、疗效以及避免细菌滋生等方面都直接受到温湿度变化的影响。 药品质量和安全是医疗行业的首要任务之一&#xff0c;药库温湿度监控在此过程中发挥着关键作用。通过科学合理地实施温湿度监控…

Java 线程的生命周期和状态(实践加深理解)

一、常规回答&#xff08;八股文&#xff09; 线程的生命周期一共分为有6个状态&#xff0c;在某个时刻中&#xff0c;一个线程只会处在6个状态中的其中一种。 第1&#xff1a;初始状态&#xff08;NEW&#xff09; 当前的线程已经被创建了出来&#xff0c;但是还没有通过调用…

宝塔如何部署springboot前后端分离项目

一&#xff1a;准备工作 1.阿里云购买一个centos的服务器 2.环境准备&#xff1a; 2.1 jdk1.8 2.2 nginx 2.3 mysql 2.4 redis 2.5tomcat 这里根据网上的教学很好安装如果是宝塔的话除了redis都可以一键安装 软件商城安装这三个即可 数据库也是可以直接可视化创建并且导入sq…

计蒜客T1115——字符串判等

水题不解释&#xff0c;考研复习压力偶尔写一道换换心情还不错~ 这里有一个比较有趣的知识点&#xff0c;对于同时输入多个字符串时还要允许空格的输入&#xff0c;那么普通的cin函数就不能满足要求了&#xff0c;这里采用getline函数解决&#xff0c;如下&#xff1a; string …

PS 2023 安装选项页面显示不全

文章目录 PS 2023 安装选项页面显示不全解决办法 PS 2023 安装选项页面显示不全 解决办法 按住Tab键&#xff0c;点击该安装选项页面即可&#xff0c;如下如所示&#xff1a;

【Django】招聘面试管理01 创建项目运行项目

文章目录 前言一、创建项目二、运行项目三、访问后台管理页面四、配置项总结 前言 跟着视频学一学&#xff0c;记录一下。 一、创建项目 照着步骤创建虚拟环境&#xff0c;安装Django等依赖包&#xff0c;创建项目&#xff1a;【Django学习】01 项目创建、结构及命令 > d…

【Linux】带你了解高级IO

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;IO的基本…

【Rust】Rust学习 第七章使用包、Crate和模块管理不断增长的项目

目前为止&#xff0c;我们编写的程序都在一个文件的一个模块中。伴随着项目的增长&#xff0c;你可以通过将代码分解为多个模块和多个文件来组织代码。一个包可以包含多个二进制 crate 项和一个可选的 crate 库。伴随着包的增长&#xff0c;你可以将包中的部分代码提取出来&…

ArcGIS Pro实践技术应用暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…

动力节点新版Docker实用教程,从入门到高阶一套搞定

Docker是一种轻量级的容器化平台&#xff0c;它可以大大简化应用程序的在不同环境中的部署、管理与扩展。 学习Docker可以让你更好地了解和应用容器化技术&#xff0c;实现软件运环境的快速部署和管理。 如何系统全面掌握Docker&#xff1f; 推荐一套天花板级Docker教程&#x…

前端页面--视觉差效果

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><link rel"stylesheet" href"https://un…

Explorable Tone Mapping Operators

Abstract 色调映射在高动态范围(HDR)成像中起着至关重要的作用。 它的目的是在有限动态范围的介质中保存HDR图像的视觉信息。 虽然许多工作已经提出从HDR图像中提供色调映射结果&#xff0c;但大多数只能以一种预先设计的方式进行色调映射。 然而&#xff0c;声调映射质量的主…

lc1.两数之和

暴力解法&#xff1a;两个for循环&#xff0c;寻找和为target的两个数的索引 时间复杂度&#xff1a;O(n2) 空间复杂度&#xff1a;O(1) 哈希表&#xff1a;遍历数组&#xff0c;将nums数组的数和索引分别存储在map的key和value中&#xff0c;一边遍历&#xff0c;一边寻找是…

多语言多用户购物网站--海外仓进出口贸易平台开发

搭建一个多语言多用户购物网站需要具备一定的技术和资源&#xff0c;下面是一个大致的步骤&#xff1a; 1.确定需求&#xff1a;首先确定购物网站的功能需求&#xff0c;包括商品展示、购物车、订单管理、支付方式、物流管理等。同时还需要考虑到海外仓进出口贸易的特点&#…

如何使用Pycharm 快速搭建 Django 项目 (分享详细图文教程)

1. 准备工作 在开始创建Django项目之前&#xff0c;需要先确保已经安装了Python和Pycharm。并且python中已经安装好了Django依赖。 1安装python&#xff08;这里我安装使用的是python3.11.4稳定版本&#xff09; 官网下载太慢了这里直接贴网盘下载连接了&#xff0c;一起贴出py…

java版工程项目管理系统源码+系统管理+系统设置+项目管理+合同管理+二次开发em

​ 鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部…

解决vue3中不能使用vue-simple-uploader

vue-simple-uploader本身是基于vue2的&#xff0c;直接npm i vue-simple-uploader -S下载下来版本的是0.7.6。在vue3中无法使用会报错。 解决&#xff1a;使用next安装接下来要发布的版本就会下载1.0.1版本&#xff0c;即可使用vue3 npm i vue-simple-uploadernext -S 注意&…