Fourteenth Week's ARST

本文分享了LeetCode上的挑战题“Squares of a Sorted Array”的两种解决方案,一种使用冒泡排序,另一种采用双指针法,后者效率显著提升。同时,文章介绍了计算机视觉领域的最新进展,以及C++排序算法和字符串反转的多种方法。

ARST

Algorithm: 每周一道Leetcode
Review: 每周阅读并点评至少一篇英文技术文章
Tip: 每周学习技术技巧
Share: 每周分享一篇有观点和思考的技术文章

A

Leetcode977——Squares of a Sorted Array
题目要求:
Given an array of integers A sorted in non-decreasing order, return an array of the squares of each number, also in sorted non-decreasing order.
Example 1:

Input: [-4,-1,0,3,10]
Output: [0,1,9,16,100]

Example 2:

Input: [-7,-3,2,3,11]
Output: [4,9,9,49,121]

Note:
1.1 <= A.length <= 10000
2.-10000 <= A[i] <= 10000
3.Ais sorted in non-decreasing order.
C++编写:
一开始想的笨拙方法

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        vector<int> B;
        for(int i=0;i<A.size();i++)
        {
            B.push_back(pow(A[i],2));
        }
        int j,pos,bound,hold;
        pos=A.size()-1;
        while(pos)
        {
            bound=pos;
            pos=0;
            for(j=0;j<bound;j++)
            {
                if(B[j]>B[j+1])
                {
                    hold=B[j];
                    B[j]=B[j+1];
                    B[j+1]=hold;
                    pos=j;
                }
            }
        }
        return B;
    }
};

一开始我的想法就是把所有的平方值都放进一个数组里面,然后对数组进行排序,最后即可以得到所要的结果。本来上学就只提到了冒泡排序,这里也是用的冒泡排序编写的,但是感觉冒泡太耗时,因此也是去看了看各种排序算法,后面的Tip会提到。不过这个方法实在是太慢了,我们可以从运行效果看出来,因此也去看了一下别人的思路写出来。
在这里插入图片描述
代码较短且一目了然的代码:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        vector<int> B;
        int left=0,right=A.size()-1;
        while(left <= right)
        {
            if(abs(A[left]) >= abs(A[right]))
            {
                B.push_back(pow(A[left],2));
                left++;
            }
            else
            {
                B.push_back(pow(A[right],2));
                right--;
            }
        }
        reverse(B.begin(), B.end());
        return B;
    }
};

这个运行速度就比前面快了接近10倍,由于运行速度其实是和地区、网络都有关的,运行的最好的一次效果如下
在这里插入图片描述

R

这种计算机视觉技术实际上可以看到角落
来自美国,加拿大和欧洲的一组计算机视觉研究人员开发了一种技术来观察角落。通过这篇文章的介绍,我们可以知道现在计算机视觉技术也是发展得非常迅速的,并且它能够实现的很多功能可能我们都还不知道,现在的科技发展得越来越迅速了,我们只要基础够扎实,能力够强,完全也可以去探索这些我们所了解领域里的未知世界。

T

其实在很早之前是写过有关排序算法的一个知识的,但是这次也是很惊喜地找到了一个关于排序算法的文章,写得非常详细,并且讲的很清晰,有图有过程很好理解
C++八大排序算法
同时这周的Leetcode可能会用到反转一个数组,我知道Python有这种函数sorted()来实现的,但对于C++还真的不太清楚,于是找了一下反转的方法,反转数组倒是只找到个reverse()函数,却是找到了字符串反转的方法
c++中字符串反转的3种方法
当然数组反转也可以自己编写一个函数进行实现,于是自己写了一个反转数组的函数,代码如下:

S

C++类设计的五项基本原则之开闭原则

C语言-光伏MPPT算法:电导增量法扰动观察法+自动全局搜索Plecs最大功率跟踪算法仿真内容概要:本文档主要介绍了一种基于C语言实现的光伏最大功率点跟踪(MPPT)算法,结合电导增量法与扰动观察法,并引入自动全局搜索策略,利用Plecs仿真工具对算法进行建模与仿真验证。文档重点阐述了两种经典MPPT算法的原理、优缺点及其在不同光照和温度条件下的动态响应特性,同时提出一种改进的复合控制策略以提升系统在复杂环境下的跟踪精度与稳定性。通过仿真结果对比分析,验证了所提方法在快速性和准确性方面的优势,适用于光伏发电系统的高效能量转换控制。; 适合人群:具备一定C语言编程基础和电力电子知识背景,从事光伏系统开发、嵌入式控制或新能源技术研发的工程师及高校研究人员;工作年限1-3年的初级至中级研发人员尤为适合。; 使用场景及目标:①掌握电导增量法与扰动观察法在实际光伏系统中的实现机制与切换逻辑;②学习如何在Plecs中搭建MPPT控制系统仿真模型;③实现自动全局搜索以避免传统算法陷入局部峰值问题,提升复杂工况下的最大功率追踪效率;④为光伏逆变器或太阳能充电控制器的算法开发提供技术参考与实现范例。; 阅读建议:建议读者结合文中提供的C语言算法逻辑与Plecs仿真模型同步学习,重点关注算法判断条件、步长调节策略及仿真参数设置。在理解基本原理的基础上,可通过修改光照强度、温度变化曲线等外部扰动因素,进一步测试算法鲁棒性,并尝试将其移植到实际嵌入式平台进行实验验证。
<think>我们得到的错误信息是:TypeError: unsupported operand type(s) for +: 'int' and 'list' 这个错误发生在列表的拼接过程中,具体位置在代码的第747行。 错误原因:在构建列表时,我们试图将整数(0)和列表(twen_two)使用加号(+)连接,而加号操作符在整数和列表之间是没有定义的。 观察代码片段: [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0] + twen_two + ... 实际上,根据错误信息,代码可能是这样写的(注意括号位置): [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0 + twen_two + ... ] 错误信息中显示:0 + twen_two,即一个整数和一个列表相加,这是不允许的。 问题在于括号的匹配。原始代码可能是: [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0] + twen_two + ... # 正确写法 但是根据错误信息,实际代码可能是: [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0 + twen_two + ... ] # 错误写法 解决方案:确保列表的结束括号在正确的位置,即第一个列表结束后再开始拼接后续的列表。 让我们对比两行代码: 正确写法(使用正确的括号): result = [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0] + twen_two + twen_three + ... 错误写法(括号提前关闭): result = [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0 + twen_two + ... ] 在错误写法中,第一个列表包含了`0 + twen_two`作为其最后一个元素,这导致尝试将整数0与列表twen_two相加,从而引发类型错误。 因此,我们需要检查代码第747行,确保第一个列表的结束括号`]`位于所有加法操作之前,即先完成第一个列表的构造,然后再使用加号拼接其他列表。 修改前(错误): [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0 + twen_two + ...] 修改后(正确): [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0] + twen_two + ... 另外,需要检查所有参与拼接的变量(twen_two, twen_three, ... , jank_res)是否都是列表类型。如果其中某个变量不是列表,例如是整数,那么同样会出现类似错误(比如整数和后续的列表相加)。但根据错误信息,当前问题明确是整数和列表相加,所以首要解决括号问题,然后再考虑其他变量的类型。 如果解决了括号问题后,还有可能出现其他类型错误,比如某个变量是整数而不是列表,那么我们可以使用之前提到的防御性编程方法(如`ensure_list`函数)来确保每个变量都是列表。 具体步骤: 1. 修正括号位置,确保第一个列表正确结束。 2. 如果还有其他类型错误,则对每个变量进行处理,确保它们都是列表。 修正后的代码示例: result = [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0] + \ twen_two + \ twen_three + \ twen_four + \ twen_five + \ twen_six + \ twen_seven + \ twen_eight + \ twen_nine + \ jank_res 为了代码清晰,可以使用括号换行。 另外,如果某些变量可能是非列表,可以这样处理: # 将非列表转换为列表 def to_list(x): if isinstance(x, list): return x else: return [x] # 或者使用之前提到的ensure_list函数 twen_two = ensure_list(twen_two) # ... 其他变量同理 但首先,我们修正括号位置。 注意:根据错误信息,代码中实际写的是`0 + twen_two`,所以括号一定是在0后面就关闭了,然后紧接着是`+ twen_two`被错误地包含在列表内部作为最后一个元素的计算。因此,将括号移动到0的后面,使得第一个列表包含8个元素(fourteenth, 0,0,0,0, nineteenth,0,0),然后再加上后面的列表。 如果问题仍然存在,请检查变量`twen_two`等是否真的是列表。如果不是,则需要进行转换。 </think>### 错误分析与解决方案 #### 错误原因分析 根据您提供的错误信息: ``` TypeError: unsupported operand type(s) for +: 'int' and 'list' ``` 这个错误发生在以下代码中: ```python [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0 + twen_two + ... ] ``` 错误的核心原因是: 1. **括号位置错误**:您的代码中括号 `]` 放置位置不正确 2. **类型混淆**:您试图将整数(`0`)直接与列表(`twen_two`)相加 3. **操作顺序问题**:`0 + twen_two` 部分导致了整数与列表的非法操作 具体来说: - `0` 是整数类型 - `twen_two` 是列表类型 - Python 不允许直接使用 `+` 操作符组合整数和列表 #### 解决方案 ##### 1. 修正括号位置(最快修复) 将列表的结束括号 `]` 正确放置: ```python # 错误代码 [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0 + twen_two + ... ] # 正确代码 [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0] + twen_two + ... ``` ##### 2. 使用列表推导式(更清晰) 将数字值放入列表中再拼接: ```python result = ( [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0] + list(twen_two) + list(twen_three) + list(twen_four) + list(twen_five) + list(twen_six) + list(twen_seven) + list(twen_eight) + list(twen_nine) + list(jank_res) ) ``` ##### 3. 使用列表扩展方法(避免运算符问题) 使用 `extend()` 代替 `+` 操作符: ```python result = [fourteenth, 0, 0, 0, 0, nineteenth, 0, 0] result.extend(twen_two) result.extend(twen_three) result.extend(twen_four) result.extend(twen_five) result.extend(twen_six) result.extend(twen_seven) result.extend(twen_eight) result.extend(twen_nine) result.extend(jank_res) ``` ##### 4. 统一类型处理(防御性编程) 确保所有元素都是列表类型再拼接: ```python def to_iterable(obj): """将任意对象转换为可迭代对象""" if isinstance(obj, (list, tuple)): return obj try: return list(obj) except TypeError: return [obj] result = ( [fourteenth] + [0] * 4 + # 四个0 [nineteenth] + [0] * 2 + # 两个0 to_iterable(twen_two) + to_iterable(twen_three) + to_iterable(twen_four) + to_iterable(twen_five) + to_iterable(twen_six) + to_iterable(twen_seven) + to_iterable(twen_eight) + to_iterable(twen_nine) + to_iterable(jank_res) ) ``` #### 错误预防建议 1. **使用类型提示**: ```python from typing import List, Union def create_result( fourteenth: float, nineteenth: float, twen_two: Union[List, int], # ...其他参数... ) -> List: """创建结果列表""" ``` 2. **添加单元测试**: ```python import unittest class TestResultCreation(unittest.TestCase): def test_list_creation(self): # 测试各种边界情况 result = create_result(1.0, 2.0, [3, 4], [5], 6, None) self.assertEqual(result, [1.0, 0, 0, 0, 0, 2.0, 0, 0, 3, 4, 5, 6, None]) ``` 3. **使用IDE的静态检查**: - 启用PyCharm/VSCode的类型检查功能 - 使用mypy进行静态类型检查: ```bash pip install mypy mypy your_script.py ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值