L37.【LeetCode题解】快乐数(双指针思想)

目录

1.题目

2.分析

3.代码

4.提交结果

5.题外话

证明:一定是循环的

前置知识:鸽巢原理

不严格证明


1.题目

https://leetcode.cn/problems/happy-number/

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n快乐数 就返回 true ;不是,则返回 false

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 2^(31) - 1

2.分析

分析两个测试数据:19和2,

19-->82-->68-->100-->1-->1--->......-->1

2-->4-->16->>37-->58-->89-->145-->42-->20-->4-->16-->37-->58-->89-->145-->42-->20-->4-->...

如果画图则非常清晰:

 

发现本题画出的两个情况特别像之前讲过的环形链表

L10.【LeetCode题解】环形链表(判断链表中是否有环)

L22.【LeetCode题解】环形链表(返回环的入口点 方法1)

只不过这道题不在于判断是否有环,而是在有环的情况下,判断循环的数是否为1

可以在这里直接套用快慢指针的解法(双指针解法),不过这里的快慢"指针"应该理解为"快慢"

回顾L22文章的结论推导:

结论:设有两个新的指针p1和p2,p1从起始点出发,p2从相遇点出发,设p1和p2每次都走1步,则p1和p2一定相遇   


设"快数"为fast,慢数为slow,初始值都为n,"快数"一次循环变化两次,"慢数"一次循环变化一次,最终"快数"的值一定等于"慢数"的值(L10文章和L22文章得到的结论),再判断"快数"和"慢数"相遇的值即可("快数"和"慢数"选任何一个判断其值),如果为1,为快乐数,反之不是快乐数

3.代码

"对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和"变化的过程写成一个函数process,提高代码可读性

class Solution {
public:
    int process(int n)
    {
        int sum=0;
        while(n)
        {
            sum+=(n%10)*(n%10);
            n/=10;
        }
        return sum;
    }
    bool isHappy(int n) 
    {
        int fast=n;
        int slow=n;
        while(1)
        {
            //变化2次,嵌套调用,也可以写两遍fast=process(fast);
            fast=process(process(fast));
            slow=process(slow);//变化1次
            if (fast==slow)
                break;
        }
        return fast==1;
    }
};

4.提交结果

5.题外话

本题的"然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1"说明: 无论是什么数,最终结果只有一种情况:循环,没有其他不循环的情况

证明:一定是循环的

前置知识:鸽巢原理

n个鸽子放入(n+1)个鸽巢中,至少存在两个鸽子在一个鸽巢中,也可以这样说:观众席上有366位观众,至少存在两位观众生日是相同的

不严格证明

本题n的类型为int,而int类型的最大值为2147483647,process(2147483647)==260,则给定任意一个正整数n,process(n)的结果在[1,260],则经过261次运算,至少有两次process执行的结果是相同的,因此结果是循环的

<think>好的,我需要帮助用户解决如何正确调用新订单详情列表API接口的问题。首先,我需要回顾用户提供的引用内容,特别是淘宝和微信支付相关的API调用流程。用户的问题是关于新订单详情列表的API,可能涉及类似淘宝的订单详情接口。 首先,根据引用[1]和[2],淘宝的订单详情接口需要申请权限,审核通过后才能调用。这可能意味着调用任何订单相关的API都需要类似的步骤,包括注册应用、申请权限、获取授权等。因此,我应该将这些步骤作为基础流程。 接下来,引用[5]提到微信支付的下单API返回的响应格式,这可能说明不同平台的API响应结构可能不同,用户需要注意正确的参和响应处理。不过用户的问题是关于订单列表,而不是支付,所以可能需要调整重点。 我需要确保回答的结构清晰,分步骤说明,比如注册应用、申请权限、获取Access Token、构造请求、处理响应等。同时,需要提醒用户注意参的正确性、错误处理、据安全等事项,如引用[4]提到的合规性和技术挑战。 另外,用户可能遇到的问题包括权限申请被拒、参错误、接口版本过时等,需要给出相应的注意事项。例如,引用[3]提到使用Python开发API接口,可能用户需要代码示例,但用户的问题更偏向于调用流程而不是具体代码,所以可能需要酌情提供伪代码或参示例。 最后,生成相关问题需要考虑用户可能的后续疑问,比如性能优化、错误排查、据解析等,确保覆盖用户可能的需求。</think>### 如何正确调用新订单详情列表API接口? 调用新订单详情列表API接口需遵循以下步骤,以淘宝API为例(其他平台流程类似): --- #### 1. **注册开发者账号并创建应用** - 在目标平台(如淘宝开放平台、微信支付等)注册开发者账号。 - 创建应用并记录 `App Key` 和 `App Secret`,用于后续身份验证[^2][^4]。 --- #### 2. **申请API调用权限** - 在应用管理后台找到“订单详情列表”相关接口(例如淘宝的 `taobao.trade.fullinfo.get`)。 - 提交接口权限申请,填写用途说明并等待平台审核[^1]。 --- #### 3. **获取访问令牌(Access Token)** - 使用OAuth 2.0协议获取临时令牌: ```http POST /token HTTP/1.1 Host: api.xxx.com Params: { "grant_type": "client_credentials", "client_id": "Your_App_Key", "client_secret": "Your_App_Secret" } ``` - 返回示例: ```json { "access_token": "xxx", "expires_in": 7200 } ``` --- #### 4. **构造API请求** - **接口地址**:根据文档填写(如淘宝为 `https://api.xxx.com/router/rest`)。 - **请求参**: ```json { "method": "taobao.trade.list.get", "timestamp": "2023-01-01 00:00:00", "format": "json", "app_key": "Your_App_Key", "sign_method": "md5", "sign": "计算后的签名", "fields": "order_id,create_time,status", "start_time": "2023-01-01 00:00:00", "end_time": "2023-01-31 23:59:59" } ``` - **签名生成**:将参按字母排序后拼接字符串,附加 `App Secret`,计算MD5或HMAC[^5]。 --- #### 5. **发送请求并处理响应** - 使用HTTP客户端(如Python的 `requests`)发送GET/POST请求: ```python import requests url = "https://api.xxx.com/router/rest" headers = {"Authorization": "Bearer {access_token}"} response = requests.get(url, params=request_params, headers=headers) data = response.json() ``` - **响应示例**: ```json { "orders": [ {"order_id": "123", "create_time": "2023-01-01", "status": "paid"}, {"order_id": "456", "create_time": "2023-01-02", "status": "shipped"} ] } ``` --- #### 6. **错误处理与调试** - 检查HTTP状态码(如401表示令牌失效,403表示权限不足)。 - 解析错误码文档(如淘宝的 `error_code=15` 表示参缺失)[^5]。 --- ### 注意事项 1. **参合规性**:时间范围不得超过平台限制(如淘宝默认查询24小时内订单)。 2. **频率限制**:避免高频调用触发流控(建议设置请求间隔)。 3. **据安全**:敏感字段(如用户ID)需脱敏处理[^4]。 4. **接口版本**:确认使用最新版API,避免兼容性问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangcoder

赠人玫瑰手有余香,感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值