[28]Excel表列序号和Pow(x, n)

文章讲述了如何将Excel表格的列标题转换为对应的列序号,以及如何高效地实现指数运算(Pow)。提供了两种不同的Python解决方案,包括正向计数和快速幂的方法,并对比了它们在处理复杂情况时的效率差异。

*内容来自leetcode

1.Excel表列序号

题目要求

给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。

例如:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...

示例 1:

输入: columnTitle = "A"
输出: 1

示例 2:

输入: columnTitle = "AB"
输出: 28

提示:

1 <= columnTitle.length <= 7
columnTitle 仅由大写英文组成
columnTitle 在范围 ["A", "FXSHRXW"] 内

思路

不同长度的列名称所能表示的列的个数是可以算出来的,比如一个长度为1的列所能表达的列范围为1-26,长度为2的列所能表达的范围为27-26*26,以此类推。所以可以通过列名称的长度推断出当前长度能表示的列序号的起点,比如长度为3 的列名称表示序号的起点为"AAA"表示的26*26+1。然后再根据不同的字母进行累加,比如"ACA"就是在"AAA"的基础上加26*3,最终就可以得到最后的结果。

class Solution:
    def titleToNumber(self, columnTitle: str) -> int:
        n = len(columnTitle)
        res = 1
        minN = 1
        for i in range(1,n):
            minN *= 26
            res += minN

        for letter in columnTitle:
            dis = ord(letter) - ord('A')
            res += dis * minN
            minN //= 26
        return res

官方题解是正着直接进行计数的,称之为进制转化

class Solution:
    def titleToNumber(self, columnTitle: str) -> int:
        number, multiple = 0, 1
        for i in range(len(columnTitle) - 1, -1, -1):
            k = ord(columnTitle[i]) - ord("A") + 1
            number += k * multiple
            multiple *= 26
        return number

2.Pow(x, n)

题目要求

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

思路

首先提醒,在python中有现成的对幂函数的实现,因此可以直接

return x ** n

具体实现来说,最为直观的思路就是通过循环来一次次的乘法来完成。

class Solution:
    def myPow(self, x: float, n: int) -> float:
        ans = 1
        if n == 0:
            return 1
        elif n > 0:
            while n > 0:
                ans *= x 
                n -= 1
        else:
            while n < 0 :
                ans *= (1/x)
                n += 1
        return ans

问题就在于在遇到一些比较复杂的例子的时候这种方法的时间超时。

所以就需要使用快速幂来实现,幂函数的计算过程如下

x→x2→x4→x8→x16→x32→x64

从直接算需要对x乘63次减为了6次。

具体实现来说,有迭代和递归两种方式

首先是迭代

class Solution:
    def myPow(self, x: float, n: int) -> float:
        if n == 0:
            return 1
        dd = n if n > 0 else -n
        res = 1
        while dd != 0:
            if dd % 2 != 0:
                res *= x
            x *= x
            dd //= 2
        return res if n > 0 else 1/res

递归

递归的实现是根据迭代的代码改的

class Solution:
    #递归
    def myPow(self, x: float, n: int) -> float:
        def getAns(x, dd, res):
            if dd == 0:
                return res
            if dd % 2 != 0:
                res *= x
            x *= x
            return getAns(x,dd//2,res)

        dd = n if n > 0 else -n
        ans = getAns(x,dd,1)
        
        return ans if n > 0 else 1/ans

官方的

class Solution:
    #递归
    def myPow(self, x: float, n: int) -> float:
        def getAns(N):
            if N == 0:
                return 1
            y = getAns(N//2)
            return y*y if N % 2 == 0 else y*y*x

        return getAns(n) if n > 0 else 1/getAns(-n)

<think>我们注意到用户的问题是关于Python内置函数pow()的使用,用于计算x的n次幂。由于用户意图不明确,但问题明确指向pow函数,因此需要解释pow函数的用法、参数以及相关注意事项。根据要求,我们需要进行网络搜索(这里我们已知Python官方文档内容,但为了模拟,将整合已知知识):已知:pow()函数是Python的内置函数,用于计算x的n次幂,即x**n。它还可以接受第三个参数,用于模运算,即pow(x,n,mod)。我们将按照以下步骤组织回答:1.基本用法:计算x的n次幂2.三个参数的用法:计算x的n次幂对mod取模3.与**运算符math.pow()的区别注意:由于要求避免使用步骤词汇,我们将直接分点说明,每个点之间换行。另外,根据格式要求,如果涉及代码公式,需要遵循指定格式。最后,生成相关问题。由于问题中不涉及复杂数学公式,但涉及代码,所以代码部分会使用代码块。开始组织回答:</think>### Python `pow()` 函数详解 `pow()` 是 Python 的内置函数,用于计算 $x$ 的 $n$ 次幂($x^n$)。支持两种调用方式: #### 1. **双参数形式:计算幂** ```python pow(x, n) # 结果等价于 x**n ``` - `x` 为底数(整数/浮点数/复数) - `n` 为指数(整数/浮点数/复数) **示例**: ```python pow(2, 3) # 返回 8 (2^3) pow(2.5, 2) # 返回 6.25 (2.5^2) ``` #### 2. **三参数形式:模幂运算** ```python pow(x, n, mod) # 结果等价于 (x**n) % mod ``` - `mod` 为取模的基数(必须为正整数) - 比直接计算 `(x**n) % mod` **效率更高**,尤其适用于大数运算 **示例**: ```python pow(3, 4, 5) # 计算 (3^4)%5 = 81%5 = 1 ``` --- ### 关键注意事项 - **负数指数**:支持负指数计算(返回浮点数) ```python pow(4, -2) # 返回 0.0625 (1/4^2) ``` - **复数支持**:底数指数可为复数 ```python pow(1+2j, 2) # 返回 (-3+4j) ``` - **与 `**` 运算符的区别**: - `pow()` 是函数,`**` 是运算符,两者数学结果一致 - `pow()` 的三参数形式为独有功能 - **与 `math.pow()` 的区别**: - `math.pow()` 仅支持浮点数运算,且**不支持三参数模运算** - `math.pow()` 对整数输入会转换为浮点数(可能损失精度) --- ### 常见应用场景 1. **快速幂计算**(如加密算法) ```python pow(123456, 987654, 1000007) # 高效计算大数模幂 ``` 2. **几何计算**(如圆的面积 $πr^2$) ```python import math radius = 5 area = math.pi * pow(radius, 2) ``` 3. **科学计算**(如指数衰减 $e^{-λt}$) ```python decay = pow(math.e, -0.5 * time) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值