Acy夕拾算法 Week1_day1

LeetCode 26. 删除有序数组中的重复项

/*整理思路:
·空数组时,返回0;–如果不写会返回1–因为int cur=1
·双指针,cur当前结果,pre去找 不同
pre需要到最后,所以pre<size();pre++
pre&cur-1比较,如果不同
把pre赋给cur;cur++

错误点:
·思路错误:判断他们==的时候,pre赋给cur
·遍历时用的i,没有限制pre
·未考虑0时
*/

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()==0)  return 0;
        int cur = 1, pre = 1;
        for (; pre < nums.size(); pre++)
        {
            if (nums[pre] != nums[cur-1])
            {
                nums[cur] = nums[pre];
                cur++;
            }
        }
        return cur;
    }
};

LeetCode 27. 移除元素

/*我的思路:
都从0开始遍历,cur是最终答案,pre向后遍历,
遍历到不等于val的数时,放到cur的位置,这样cur以前的都不等于val
*/

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        // if(nums.size()==0)  return 0;不需要,因为cur=0一开始
        int cur = 0;
        for(int pre = 0; pre < nums.size(); pre++)
        {
            if(nums[pre] != val)//pre遍历到不等时,放到cur的位置
            {
                nums[cur] = nums[pre];
                cur++;
            }
        }
        return cur;
    }
};

LeetCode 344. 反转字符串

/*我的思路:
·是以字符数组存储字符串,并且要原地修改
·双指针,直接交换最前后两位置的内容,最前++,最后–
遍历时,保证最前<最后 —不用==,因为两个指针在同一位置,交不交换都是那个字母
·不论数组长度是双数还是单数,都成立。
*/

class Solution {
public:
    void reverseString(vector<char>& s) {
        // int high = 0, tail = s.size()-1;
        // for(int i = 0; i < s.size()/2; i++)
        for(int high = 0, tail = s.size()-1;high < tail; high++, tail--)
        {
            int t = s[high];
            s[high] = s[tail];
            s[tail] = t;
            // high++, tail--;
        }
    }
};
<think>根据用户反馈,当USERR1为500时出现“未知命令'2.5'”的错误。这通常是因为在AutoLISP的`command`函数中传递参数时,数字被当作字符串处理,而AutoCAD命令提示符下输入数字会被解释为命令。然而,在`command`函数中,数字参数应该被正确传递,除非有特殊情况。 经过分析,问题可能出在`command`函数调用时,参数传递的顺序或类型不正确。但更可能的原因是:在命令执行过程中,AutoCAD的`INSERT`命令要求输入比例因子时,如果之前命令中断或参数传递不完整,可能会导致AutoCAD将后续输入(包括数字)当作命令执行。 另一种可能是:在调用`command`函数时,如果传递的参数个数与命令要求不匹配,会导致AutoCAD在等待输入时,下一个参数被当作新命令执行。 在之前的代码中,我们使用了: (command "_.insert" ".\\ACY\\mb1.dwg" (getpoint "\n ★ 请选择插入位置:") scaleFactor ; X比例 "" ; Y比例(同X) "" ; 旋转角度 ) 按照INSERT命令的标准流程,它需要以下输入: 1. 块名 2. 插入点 3. X比例因子(可以输入数值,或者用空响应表示使用默认值1.0,或者输入一个点来同时指定X和Y比例) 4. Y比例因子(如果上一步输入了数值,则下一步可以输入Y比例,或者用空响应表示与X相同) 5. 旋转角度 我们的代码中,在X比例因子位置传递了`scaleFactor`(一个数值),然后是两个空字符串(分别表示Y比例与X相同,旋转角度为0)。这应该是正确的。 但是,为什么会出现“未知命令'2.5'”呢?可能是因为在命令执行过程中,由于某种原因(例如块文件未找到),INSERT命令被中断,然后AutoCAD收到了我们传递的`scaleFactor`(比如2.5)作为新命令,而它不是一个命令。 因此,我们需要确保块文件存在,并在插入前检查路径。同时,我们可以通过添加错误处理来避免整个命令中断。 修改后的代码(增加块文件存在性检查): ```lisp (defun c:CZDT (/ scaleDenom scaleFactor oldOsmode pt blockPath) ; 设置块路径(注意:路径中的反斜杠需要双写或改为斜杠) (setq blockPath ".\\ACY\\mb1.dwg") ; 检查文件是否存在 (if (not (findfile blockPath)) (progn (alert (strcat "错误:找不到块文件 " blockPath)) (exit) ) ) ; 获取比例 (setq scaleDenom (getvar "USERR1")) (if (or (null scaleDenom) (<= scaleDenom 0)) (progn (alert "警告:USERR1未设置或无效,使用默认比例1:200") (setq scaleFactor 1.0) ) (setq scaleFactor (/ (float scaleDenom) 200.0)) ) ; 保存并设置捕捉模式 (setq oldOsmode (getvar "OSMODE")) (setvar "OSMODE" 0) ; 获取插入点 (setq pt (getpoint "\n ★ 请选择插入位置:")) (if (not pt) (progn (alert "未选择插入点,命令取消。") (setvar "OSMODE" oldOsmode) (exit) ) ) ; 执行插入命令 (command "_.insert" blockPath pt scaleFactor "" "") ; 恢复捕捉模式 (setvar "OSMODE" oldOsmode) (princ) ) ``` ### 关键修改: 1. **块文件检查**:使用`(findfile blockPath)`确认文件存在,避免因文件缺失导致命令中断。 2. **插入点检查**:如果用户取消插入点选择(按ESC),则退出命令并恢复设置。 3. **变量局部化**:使用`(/ ...)`声明局部变量,避免污染全局变量空间。 ### 使用说明: - 请确保块文件路径正确(注意:在AutoLISP中,路径分隔符可以用双反斜杠或正斜杠)。 - 当USERR1为500时,`scaleFactor`计算为2.5,在`command`函数中作为数值传递,不会当作命令。 §§相关问题§§ 1. 在AutoLISP中,如何正确设置文件路径以确保在不同操作系统上都能找到块文件? 2. 如果用户需要同时设置X和Y方向不同的比例因子,代码应如何修改? 3. 如何让程序在插入块后自动调整视图以显示插入的图形? 4. 当块文件中包含多个布局时,如何指定插入特定的布局? 5. 在哪些情况下,即使块文件存在,`findfile`函数也可能返回nil? </think> 在USERR1为500时出现"未知命令'2.5'"错误,这通常是由于AutoCAD命令执行流程被意外中断导致的。以下是完整解决方案: ```lisp (defun c:CZDT (/ scaleDenom scaleFactor oldOsmode pt) ; 安全获取系统变量(避免空值错误) (setq scaleDenom (cond ((getvar "USERR1")) (200))) ; 验证比例值为正数 (if (<= scaleDenom 0) (progn (princ "\n⚠ 警告:USERR1值无效,默认使用1:200比例") (setq scaleFactor 1.0) ) (setq scaleFactor (/ (float scaleDenom) 200.0)) ) ; 保存并临时关闭对象捕捉 (setq oldOsmode (getvar "OSMODE")) (setvar "OSMODE" 0) ; 获取插入点(带取消检测) (if (setq pt (getpoint "\n ★ 请选择插入位置: <取消>")) (progn ; 使用完整命令序列确保参数正确传递 (command "_.insert") (command ".\\ACY\\mb1.dwg") (command pt) (command scaleFactor) ; 正确传递数字参数 (command "") ; Y比例同X (command "") ; 旋转角度 ) (princ "\n✖ 操作已取消") ) ; 恢复原始设置 (setvar "OSMODE" oldOsmode) (princ) ) ``` ### 问题原因与修复关键点: 1. **参数传递问题**:当比例因子为浮点数时,AutoCAD可能错误解释为命令 2. **解决方案**: - 使用分步`(command)`调用替代单次多参数调用 - 显式传递每个参数避免解析错误 - 添加`(float)`确保数值类型正确 - 包含操作取消检测机制 3. **增强健壮性**: - 默认值处理:`(cond ((getvar "USERR1")) (200))` - 比例验证:确保分母为正数 - 用户取消操作处理 - 对象捕捉状态恢复 ### 使用说明: 1. 设置比例分母: ```lisp (setvar "USERR1" 500) ; 1:500比例 ``` 2. 执行命令: ``` CZDT ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值