力扣题:
一、
思路:
将字符串数组中每个字符串转为字符数组,存入一维数组,在将这些数组结合为二维数组,计算出前几列前缀是一样的,并将这些前缀输出。
方法:
1、因为前缀最长为字符串数组中最短的字符串,所以定义二维数组列数为最短字符串长度。
2、创建方法longest(当时写错了,应为shortest),通过遍历和比较计算最短字符串长度。
3、定义二维数组arr,行数为字符串个数,列数为最短字符串长度,将字符串用charAt方法转为字符并存入二维数组中。
定义count记录前缀个数。
4、创建same(二维数组,列数)方法判断本列字符是否相同。
5、遍历二维数组的每一列,利用方法same判断是否相同,若相同则count+1,若不同则结束循环。最后截取前count个数,并输出。
代码实现:
class Solution {
public String longestCommonPrefix(String[] strs) {
//选出最短字符
int min=longest(strs);
//记录前缀个数
int count=0;
//创建二维数组存放字符
char[][] arr=new char[strs.length][min];
//赋值
for (int i = 0; i < strs.length; i++) {
for(int j=0;j<min;j++){
char c=strs[i].charAt(j);
arr[i][j]=c;
}
}
//计算前缀个数
for(int i=0;i<min;i++){
if(same(arr,i)){
count++;
}
if(!same(arr,i))
break;
}
String result=strs[0].substring(0,count);
return result;
}
public static int longest(String[] strs){
int min=strs[0].length();
for (int i = 1; i < strs.length; i++) {
int j=strs[i].length();
if(j< min){
min =j;
}
}
return min;
}
//判断列上所有数是否相等
public static boolean same(char[][] arr,int x ){
for(int j=1;j<arr.length;j++){
if(arr[j][x]!=arr[j-1][x]){
return false;
}
}
return true;
}
}
二、
方法:
1、定义方法same判断字符串是否为回文字符串。
利用双指针:i和j分别指向字符串的头和尾,判断字符是否相同,若相同则i+1,j-1继续比较,直到j>=i,返回true;若不同,则中断循环,返回false
2、
如上图,从第一个字符开始,判断它及其之后字符组成的字符串是否为回文字符串,若存在回文字符串,则中断循环,之后从第二个字符串开始,直到最后一个。
字符串通过截取substring获得。
代码实现:
class Solution {
public String longestPalindrome(String s) {
//记录回文字符串
String strHw = "";
//记录结果
String result = "";
int count=0;
for (int i = 0; i < s.length(); i++) {
for (int j =s.length()-1; j >=i; j--) {
String str = s.substring(i, j + 1);
if(same(str)){
strHw=str;
break;
}
}
if(strHw.length()>count){
count=strHw.length();
result=strHw;
}
if(result.length()>=s.length()-i-1)
break;
}
return result;
}
//判断是否为回文数
public static boolean same(String str){
int i=0,j=str.length()-1;
while (i<j){
if(str.charAt(i)!=str.charAt(j)){
return false;
}
i++;
j--;
}
return true;
}
}
三、
思路:
盛水的多少取决于元素的大小和元素之间的距离,所以从两边开始记录盛水多少,之后让元素小的指针往里进一,继续记录盛水多少,并进行比较,直到两指针相遇,返回最多盛水量。
方法:
1、利用两个计数器count和max,分别记录每次盛水量和最大盛水量
2、双指:low指向头,hight指向尾,建立循环
3,、循环内计算每次盛水量,赋值count,之后与max比较,若大于max则赋值。
4、最后返回max。
代码实现:
class Solution {
public int maxArea(int[] height) {
//记录盛水量
int count=0;
int max=0;
//比较盛水量
int i=0;
int j=height.length-1;
while (i<j){
int M=(height[i]<height[j])?height[i]:height[j];
count=M*(j-i);
if(count>max)
max=count;
if(height[i]>height[j]) {
j--;}else {
i++;
}
}
return max;
}
}
学习知识点总结:
一、多态
形式:父类类型 对象名称 =子类对象
前提:1.有继承关系
2.有父类引用指向子类 Fu f=new Zi();
3.有方法重写
使用:当一个方法的形参为一个父类时,可使用这个父类所有的子类对象。
业务发生改变时,后续代码无需更改
弊端:不能调用子类特有功能。
解决方案:强制转换
if(a instanceof b ){ }
多态调用成员的特点:
变量调用:编译看左边,运行也看左边
方法调用:编译看左边,运行看右边
二、包
使用注意:
1、用同一个包中的类不需导包
2、用java.long包中类不需导包
3、其他情况均需导包
4、使用两个包中的同类名,需要用全类名
final关键字
修饰方法,类,变量
作用:
方法:不能被重写
类:不能被继承
变量:变为常量,必须且只赋值一次
注意:final修饰引用变量,地址值不变,但对象内属性可变
权限修饰符:
作用范围:
private<空着<protected<public
若方法中代码是抽取其他方法中共性代码,这个代码一般私有。
三、代码块
1、局部代码块(没用)
2、构造代码块(不灵活,用处不大)
3、静态代码块
格式:static{ }
特点:通过static关键字修饰,随类的加载而加载,只执行一次
作用:做一些数据初始化
四、抽象类(用于统一格式)
1、抽象方法
public abstract 返回值类型 方法名();
2、抽象类(子类必须重写)
public abstract class 类名();
3、注意
抽象类不能创建对象
有抽象方法一定是抽象类
抽象类可以有构造方法,创建子类对象时赋值
4、子类
要么重写所有抽象方法
要么是抽象类
五、接口(interfance)
1、定义
public interface 接口名{}
接口不能实例化
接口与类之间是实现关系
格式:public class 类名 implem 接口名{}
接口的子类:重写所有的抽象方法
5、可在继承类的同时实现多个接口
2、接口中成员特点
1、成员变量:
只能是常量
默认修饰符:public static final
2、构造方法:
没有
3、成员方法:
抽象方法 默认:abstract
接口与接口的关系:
继承,可单继承也可多继承