ARTS打卡第一周
Algorithm 做一道leetcode算法题
题目:Z字变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
解题思路
这个问题看上去是真的难,将字符串根据行数的不同,变换之后输出
但是,仔细看这些字符的编号,发现还是有规律的
比如 3 行的第一行的字符串编号是 1,5,9,13
规律是 1 + 4 * (n - 1)
第二行 是 2,4,6,8,10,12,14,16
规律是 2 + 2 * (n-1)
第三行是 3,7,11,15
规律是 3 + 4 * (n-1)
再看4行的
1 7 13
2 6 8 12 14
3 5 9 11 15
4 10 16
然后找一下共同的规律
思考ing....
然后,我发现,其实我不用去找数学规律,我就按照这个图形方式来排列字符串就可以了
于是
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1){
return s;
}
//定义结果字符串
StringBuffer res = new StringBuffer();
//定义一个长度为行数的字符串数组
StringBuffer[] strBufs = new StringBuffer[numRows];
//初始化各行
for(int i = 0; i < numRows; i++){
strBufs[i] = new StringBuffer();
}
//方向变量,确定我们放字符的方向
int direction = 1;
//游标,指引我们在第几行放字符串
int cursor = 0;
for(int i = 0;i < s.length(); i ++){
//在游标当前行放下字符串
strBufs[cursor].append(s.charAt(i));
cursor+=direction; //游标移动
if(cursor == 0 || cursor == (numRows - 1)){
//游标到头,方向改变
direction = 0 - direction;
}
}
//拼接结果
for(int i = 0; i < numRows; i++){
res.append(strBufs[i]);
}
return res.toString();
}
}
Review
阅读并点评至少一篇英文技术文章
点评:
文中的观点是,学习编程,并不需要太多深奥的数学知识。因为数学和编程是两种不同的解决问题的方式,学好编程,并不一定需要有很好的数学知识。但是,数学知识确实是能让你在面对某些编程问题时能有更好的解决方法,所以,我们才需要学习算法。
Tips
学习至少一个技术技巧
park/unpark
基本用法,用于线程的睡眠和唤醒。park 回使当前线程睡眠,unpark可以唤醒park的线程。
用于多线程编程。
最近工作中,应用这个技术到线程池里边,当便利线程池没有空闲的连接的时候,就会把当前线程加入到等待队列,然后用park睡眠。
然后连接回收的时候,会从等待队列中取出一个线程,将连接赋予这个线程,然后唤起线程。
Share
分享一篇有观点和思考的技术文章
打卡的第一周,我希望我能坚持下去。
做算法题的时候,我刚开始在找一些数学规律,虽然找到了,但是,我就是觉得,这样写有点不舒服。
具体的不舒服就是,我觉得,应该有更巧妙,更让人觉得眼前一亮,更通俗易懂,用更少的代码就能实现的写法。
然后,我就突然就想到了这个模拟的方法,觉得很有成就感。
这是我学习编程的初衷,我喜欢编程,喜欢用代码来解决问题时带来的成就感。
读英文技术文章的时候,很多单词都不认识,先一个个生词翻译,然后再整句翻译,我不想去背单词。
我想通过多读,让我能够记住,很多单词,因为时态的不同,就不认识了。我没有时间也没有必要去死记硬背。
我只希望,我能够坚持,经常读,然后建立语感。最后能流畅的阅读。
最近,总感觉自己的编码水平到了一个瓶颈,在小公司有一个坏处,就是,老板很看重编码效率。
总希望我们能快速的写出代码,而不是写出一个好的代码,就造成,很多不熟悉的东西,不敢去用。
但是,我还是希望能写出自己满意的代码。所以,我还是想要去尝试很多不熟悉的写法,希望能让
代码更整洁,更优雅,效率更高。
以上就是我第一周的感想,希望我能坚持下去。