ARTS打卡第一周

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
分享一篇有观点和思考的技术文章

打卡的第一周,我希望我能坚持下去。
做算法题的时候,我刚开始在找一些数学规律,虽然找到了,但是,我就是觉得,这样写有点不舒服。
具体的不舒服就是,我觉得,应该有更巧妙,更让人觉得眼前一亮,更通俗易懂,用更少的代码就能实现的写法。
然后,我就突然就想到了这个模拟的方法,觉得很有成就感。
这是我学习编程的初衷,我喜欢编程,喜欢用代码来解决问题时带来的成就感。

读英文技术文章的时候,很多单词都不认识,先一个个生词翻译,然后再整句翻译,我不想去背单词。
我想通过多读,让我能够记住,很多单词,因为时态的不同,就不认识了。我没有时间也没有必要去死记硬背。
我只希望,我能够坚持,经常读,然后建立语感。最后能流畅的阅读。

最近,总感觉自己的编码水平到了一个瓶颈,在小公司有一个坏处,就是,老板很看重编码效率。
总希望我们能快速的写出代码,而不是写出一个好的代码,就造成,很多不熟悉的东西,不敢去用。
但是,我还是希望能写出自己满意的代码。所以,我还是想要去尝试很多不熟悉的写法,希望能让
代码更整洁,更优雅,效率更高。

以上就是我第一周的感想,希望我能坚持下去。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值