ARTS打卡第二周

逆序整数与编程素养

Algorithm:

Leetcode: 7. Reverse Integer
Review:
Artical:How to be a great programmer
Words and phrases:
Tips:
Share:
Algorithm:
Leetcode: 7. Reverse Integer
Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123
Output: 321

Example 2:
Input: -123
Output: -321

Example 3:
Input: 120
Output: 21

Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

思路:
逐位反转,很容易想到整除和求余运算。此题考查的重点应该是越界检查。我一开始没想到该怎么做越界检查,看了官方题解才有了思路。想通过判断 y10 + x1%10 的结果是否大于 Integer.MAX_VALUE 是不可行的,因为运算结果已经越界了,无法判断了。换个思路,我不知道 y10 + x1%10 的结果是否越界,但我知道 y和x1满足什么条件时是不越界的,因为边界我已经知道了,用边界来反推y和x1的合法值,就好办了。
首先,如果y已经大于Integer.MAX_VALUE/10了,那么无论加不加x1%10,都肯定越界了;
其次,如果y等于Integer.MAX_VALUE/10,那么当Integer.MAX_VALUE不能整除10时,那么y*10是小于Integer.MAX_VALUE的,此时就要比较x1%10和Integer.MAX_VALUE%10的大小了;
最后,因为负数的范围比正数大1,上述越界检查都针对的是正数,在正数范围内不越界的话,转换成负数也不越界,特殊情况就是负数比正数多出来的那一个数 -2^31,当x是这个数值时,肯定越界了,直接返回。

class Solution {
    /**
     此题边界检查是考察重点
     **/
    public int reverse(int x) {
        if(x == Integer.MIN_VALUE) return 0;
        
        int x1 = Math.abs(x);
        int y = 0;

        do {
            if(y > Integer.MAX_VALUE/10) return 0;
            if(y == Integer.MAX_VALUE/10 && x1%10 > Integer.MAX_VALUE%10) return 0;

            y = y * 10 + x1%10;
            x1 = x1/10;
        } while(x1 > 0);

        return y = x < 0 ? (-1*y) : y;
    }
}

Review:

Artical:How to be a great programmer
这篇文章描述了伟大程序员都有一个共性,就是:具备扎实的基础。这使得他们能够做出伟大的事情和产生突破性想法。就像金字塔一样,地基非常巨大,但越往上越细,最终在某一点达到最高处。
所谓的“基础”到底是什么呢?作者根据自己的经验和调研结果,提出了两点见解:
锻炼解决问题的能力
分析问题的本质(入木三分)
确定整体目标(有宏观意识)
带着明确的目的去解决问题(有的放矢)
3.1 把问题化繁为简,化大为小(分治法)
3.2 借助图形直观表达(所见即所得)
知易行难,作者结合自己的实践给出了一些具备可操作性的建议:
首先要理解问题。比如遇到一个难题,先搞清楚
我尝试解决的是什么问题,或者我尝试寻找什么?(unknown)
已知条件是什么?(data)
有哪些限制?(condition)
其次要制定计划。比如可以按照顺序列出先做什么再做什么;也可以画出草图。
训练成为一个解决问题的能手需要花费很多时间,但是这是值得的。
当我们阅读一些“大师”的代码时,我们会发现很容易读懂,变量都有恰当的名字,函数简洁明了,每一行代码都有明确的意图,没有多余的东西。代码清晰阐述了作者的思考过程。这就是解决问题强的人表现出来的特点。
了解计算机科学
了解计算机的工作原理,能帮助我们更好的理解自己所写的代码。通常,打基础是一件枯燥、见效慢的工作,如果有选择的话,人们通常会选择更有意思的事情来做。但是,基础打得牢,写代码会更有自信,因为我们会更清楚“如何做”和“为什么这么做”。这样会提升我们的工作质量,使我们变得更加值得信任。

另外,基础掌握得好,能帮助我们更快更好地学习其他技术。俗话说得好,“磨刀不误砍柴工”,打好基础,会事半功倍。

Words and phrases:
breakthrough:突破
Extraordinaire:非凡
stand out to me:脱颖而出
distill:揭露
essence:本质
On more than one occasion:不止一次
get stuck:止步不前
credibility:可靠性,可信性

Tips:

vim快捷键:
全选:ggVG
全选删除:ggVGd
全选复制到剪贴板:ggVG+y

Share:

对自律上瘾后,人生开挂了
一篇讲述自律的文章。我们大多数都是普通人,不是天才,也不是笨蛋,要想成功,就需要不断地付出努力。上学的时候,虽然还不太清楚理想是什么,但是有学校的规矩和家长的期望约束着我们,即使为了学习而学习,我们也还是有动力的。工作以后,缺少了来自外界的督促,我们往往容易陷入一个舒适区,即我老老实实干,手头的工作似乎也能应付,每个月到手工资虽然不多,但也基本够花。这样的日子过得飞快。一旦我们再次面临外界的压力(裁员、缺钱、不受重视等等),就会发现自己是多么容易被替代。自律,就是要求我们不要停止学习,而且不要局限于现在,要放眼未来,塑造自己的核心竞争力。所谓核心竞争力,就是自己有,别人没有的东西,只有拥有核心竞争力,才不会轻易被替代。

### ARTS打卡 Java 学习或项目进展 #### 一、Algorithm 算法练习 在算法方面,最近研究了回文验证问题中的双指针方法。通过实现 `validPalindrome` 函数来判断给定字符串是否可以通过删除最多一个字符形成回文串[^2]。 ```cpp class Solution { public: bool validPalindrome(string s) { int i = 0; int j = s.size() - 1; int diffCount = 0; while (i < j) { if (s[i] == s[j]) { ++i; --j; } else { if (diffCount > 0) return false; // 尝试移除左边或右边的一个字符并继续比较剩余部分 string sub1 = s.substr(i + 1, j - i); string sub2 = s.substr(i, j - i); return is_palindrome(sub1) || is_palindrome(sub2); } } return true; // 辅助函数用于检测子串是否为回文 auto is_palindrome = [](const std::string& str){ int l = 0, r = str.length() - 1; while(l<r && str[l]==str[r]){ ++l;--r; } return l>=r; }; } }; ``` 此版本改进了原始逻辑,在遇到不匹配的情况时不再直接修改原字符串而是创建两个新的子串分别测试其合法性,从而提高了代码可读性和效率。 #### Review 技术文章阅读心得 关于数据库操作的学习笔记中提到 MySQL 支持四种不同的事务隔离级别:未提交读(Read Uncommitted),已提交读(Read Committed),可重复读(Repeatable Read),序列化(Serializable)[^1]。每种级别的特性决定了并发环境下数据的一致性程度以及性能表现之间的权衡关系。 另外还探讨了两种常见的锁机制——悲观锁(Pessimistic Locking) 和乐观锁(Optimistic Locking) 的原理及其适用场景: - **悲观锁** 假设冲突不可避免,因此总是先锁定资源再执行更新动作; - **乐观锁** 则认为大多数情况下不会发生竞争,仅当实际发生写入时才检查是否有其他更改影响到目标对象。 这两种策略各有优劣,具体选择取决于应用的具体需求和环境特点。 #### Tip 技巧总结 对于上述提及的内容,建议开发者们理解各自系统的默认配置,并根据业务逻辑调整合适的参数设置;同时也要熟悉如何利用编程语言提供的工具去处理并发控制问题,比如 Java 中可以借助框架如 Spring 提供的支持简化分布式事务管理过程。 #### Share 经验交流 分享过程中发现很多同学对多线程下的共享变量可见性和原子性的概念存在误解。实际上,Java 内存模型规定了 volatile 关键字能保证变量的即时可见性但不具备原子性保障,而 synchronized 或者 ReentrantLock 可以提供更强大的同步功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值