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);
明天是新的一天,也要继续加油啊