2020-10-27

21 篇文章 0 订阅

10/27 继续学习算法与《java核心技术卷1 基础知识》的一天
首先今天学完了书本上的泛型类,还有做了三道的算法题,这三道算法题还算挺有意思,难过的是我有两道要先看了答案才会写,所以是在idea那里自己再写了一遍,只能感慨算法真的是大BOSS。下面是今天的一点小结:

1.虚拟机中没有泛型,只有普通的类和方法
2.所有的参数类型都会被替换成他们的限定类型
3.会合成桥方法来保持多态特性
4.为了保持类型的安全性,必要时会插入强制类型转换

1.不能实例化参数化类型的数组,例如:
var table= new Pair[10]; //Error!

**

下面是今天做到的算法题,希望继续努力!

**
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

示例 2:

输入: “cbbd”
输出: “bb”

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:判断字符串的长度,小于2的情况和大于等于2的情况,然后指定一个指针在i=0的时候,遍历数组,并且定义一个方法
来判断这个子串是否真的回文串,存储开始的下标begin=i-j,最大长度为maxlen,每次遍历到回文子串都与这个做比对,用subString方法来剪切作为输出结果

代码(个人手敲idea测试代码,非leetcode):

首先是判断子串是否回文串的函数代码:

private static boolean BoolChars(char[] c,int left,int right){
        while (left<right){
            if (c[left]!=c[right]){
                return false;
            }
            left++;
            right--;
        }
        return true;
    }

然后是主方法:

        String s="cbbddcddd";
        int len=s.length();
        if (len<2){
            System.out.println((String) null);
        }
        int begin=0;
        int maxlen=0;
        char[] chars = s.toCharArray();
        for (int i = 0; i <chars.length-1 ; i++) {
            for (int j = 1; j <chars.length ; j++) {
                if (j-i+1>maxlen&&BoolChars(chars,i,j)){
                    begin=i;
                    maxlen=j-i+1;
                }
            }
        }
        System.out.println(s.substring(begin,begin+maxlen));

一个给定字符串根据给定的行数,以从上往下、从左到右进行 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:构建一个ArrayList集合,分为numrows个元素,每个元素存储每一个row的字母数组,然后最后把他们按照顺序拼接起来,就可以得到答案。
其中利用flag这个进行顺序和倒序操作!
代码(同样是idea的个人测试巩固记忆代码):

        String s = "LCIRETOESIIGEDHN";
        int numRows = 3;
        ArrayList<StringBuilder> list = new ArrayList<>();
        for (int i = 0; i < numRows; i++) {
            list.add(new StringBuilder());
        }
        char[] chars = s.toCharArray();
        int flag = -1;
        int i = 0;
        for (char c : chars) {
            list.get(i).append(c);
            if (i == 0 || i == numRows - 1) {
                flag = -flag;
            }
            i += flag;
        }
        StringBuilder builder = new StringBuilder();
        for (StringBuilder sb : list) {
            builder.append(sb);
        }
        System.out.println(builder.toString());

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:进行取余操作再乘10来颠倒顺序,其中乘10和取余的次数决定于数字的长度,也就是可以用%来判别,然后判断是否溢出就是
用乘10再除以10是否与原数相等,相等就是不溢出,不等就是溢出了!

代码如下(也是我个人的idea编译测试的巩固记忆代码):

        int x = 156267;
        int ans = 0;
        while (x != 0) {
            if ((ans * 10) / 10 != ans) {
                System.out.println("溢出了");
                break;
            }
            ans = ans * 10 + x % 10;
            x = x / 10;
        }
        System.out.println(ans);

明天是新的一天,也要继续加油啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值