1.在字符串中找出连续最长的数字串
import java.util.Scanner;
//在字符串中找出连续最长的数字串
public class LenthTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
System.out.println(length(line));
}
public static int length(String str){
int maxLenth=0;
String str1="";
if(str ==null || str.length()==0){
return maxLenth;
}
for(int i=0;i<str.length();i++){
if(Character.isDigit(str.charAt(i))){
str1+=str.charAt(i);
}else {
str1+='a';
}
}
String[] strr = str1.split("a+");
for(int i=0;i<strr.length;i++){
maxLenth=maxLenth>strr[i].length()?maxLenth:strr[i].length();
}
return maxLenth;
}
}
package lamdba;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//在字符串中找出连续最长的数字串
public class LenthTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
System.out.println(length(line));
}
public static int length(String str){
int maxLenth=0;
if(str ==null || str.length()==0){
return maxLenth;
}
Pattern p = Pattern.compile("\\d{1,}");
Matcher m = p.matcher(str);
while (m.find()){
maxLenth=maxLenth>m.group().length()?maxLenth:m.group().length();
}
return maxLenth;
}
}
2.有一100阶层的楼梯,有三种走楼梯方式,一次走一阶, 一次走两阶,一次走三阶
public class FoolTest {
public static void main(String[] args) {
System.out.println(fool(4));
}
private static int fool(int num){
if(num == 3){
return 4;
}else if(num ==1){
return 1;
}else if(num ==2){
return 2;
}else {
return fool(num-1)+fool(num-2)+fool(num-3);
}
}
}
3.数据库事务
数据库的事务就是作为单个逻辑单元执行的一系列操作(多条SQL语句,要么全部执行成功,要么全部执行失败)
特性:
①原子性(Atomicity):是指事务是一个不可分割的工作单元,事务中的操作要么都发生,要么都不发生。
eg:张三给李四转钱,要么张三的钱减少李四的增多,要么两个人的钱都不变。
②一致性(Consistency):是指事务前后数据的完整性要保持一致。
eg:本来 张三有1000元 李四有1000元 一共2000。张三给李四转账100元,成功:张三900元,李四1100元 一共2000元。
③隔离性(Isolation):多个事务在执行同一个操作时不能被其他事务干扰
④持久性(dependency):是指一个事务一旦提交,他对数据库中数据的改变就是就是永久性的。
eg:张三 1000 李四 1000 张三给李四转100 张三提交了,数据回滚不了了
什么是事务隔离,有哪些事务隔离级别?
事务的隔离性就是指,多个并发的事务同时访问一个数据库时,一个事务不应该被另一个事务所干扰,每个并发的事 务间要相互进行隔离。
通过设置事务隔离级别来解决读的问题
①读未提交(Read uncommitted):最低级别,上述情况都不能避免
②读已提交(Read committed):可避免 脏读 发生。Oracle默认隔离级别
③可重复读(Repeatable read):可避免 脏读、不可重复读 发生。Mysql默认隔离级别
④串行化(Serializable):可避免 脏读、不可重复读、虚读 发生
4.数据库索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
聚集(clustered)索引,也叫聚簇索引
定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
非聚集(unclustered)索引
定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引
创建索引:create index idx1 on table(col1, col2, col3);
添加索引:alter table tablename add index indexname(col1, col2);
5.gc回收机制
A:Java内存
私有内存区:伴随线程的产生而产生,一旦线程终止,私有内存区也会自动消除
程序计数器:指示当前程序执行到了哪一行,执行Java方法时记录正在执行的虚拟机字节码指令地址;执行本地方法时,计数器值为null
虚拟机栈:用于执行Java方法,栈帧存储局部变量表,操作数栈,动态链接,方法返回地址和一些额外的符加信息。程序执行时入栈;执行完成后栈帧出栈。
Java堆:Java虚拟机管理的内存中最大的一块,所有线程共享,几乎所有的对象实例和数组都在这里分配内存。GC主要就是在Java堆中进行的。 堆内存又分为:新生代(新生代又分为Eden80%,Survivor20%)和老年代(Old),并且一般新生代的空间比老年代大。
新建的对象在新生代中,如果新生代内存不够,就进行Minor GC释放掉不活跃对象;如果还是不够,就把部分活跃对象复制到老年代中,如果还是不够,就进行MajorGC释放老年代,如果还是不够,JVM会抛出内存不足,发生oom,内存泄漏。
方法区:只有一个方法区共享。实际也是堆,只是用于存储类,常量相关的信息,来存放程序中永远不变或唯一的内容(类信息【Class对象】,静态变量,字符串常量等)。但是已经被最新的 JVM 取消了。现在,被加载的类作为元数据加载到底层操作系统的本地内存区。
B: 垃圾回收机制
一)GC的主要任务:
1.分配内存
2.确保被引用对象的内存不被错误的回收
3.回收不再被引用的对象的内存空间
二)垃圾回收机制的主要解决问题
1.哪些内存需要回收?
垃圾收集器会对堆进行回收前,确定对象中哪些是“存活”,哪些是“死亡”(不可能再被任何途径使用的对象)
2.什么时候回收?
即使是被判断不可达的对象,也要再进行筛选,当对象没有覆盖finalize()方法,或者finalize方法已经被虚拟机调用过,则没有必要执行;
如果有必要执行——放置在F-Queue的队列中——Finalizer线程执行。
注意:对象可以在被GC时可以自我拯救(this),机会只有一次,因为任何一个对象的finalize() 方法都只会被系统自动调用一次。并不建议使用,应该避免。使用try_finaly或者其他方式
新建的对象在新生代中,如果新生代内存不够,就进行Minor GC释放掉不活跃对象;如果还是不够,就把部分活跃对象复制到老年代中,如果还是不够,就进行MajorGC释放老年代,如果还是不够,JVM会抛出内存不足,发生oom,内存泄漏。
3.如何回收?
这就牵扯到垃圾收集算法和垃圾收集器
6.数组中的最长前缀
public class StringTest2 {
public static void main(String[] args) {
String[] str = {"fltoor","fltest","fltbba"};
String string=longString(str);
System.out.println(string);
}
public static String longString(String[] strs){
if(strs.length==0){
return "";
}
String longFormat=strs[0];
for(int a=0;a<strs.length;a++){
while(strs[a].indexOf(longFormat) !=0){
longFormat=longFormat.substring(0,longFormat.length()-1);
if(longFormat.length()==0){
return "";
}
}
}
return longFormat;
}
}
7.给出一个整数n,计算所有小于等于n的非父整数中数字1出现的个数
package mathtest;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 给出一个整数n,计算所有小于等于n的非父整数中数字1出现的个数
* 输入:13,输出6.小于等于13的整数中数字1出现在一些数字中:1,10,11,12,13
* */
public class NumberTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
System.out.println(count(num));
}
public static int count(int num){
int len=0;
for(int i=1;i<num+1;i++){
String s = String.valueOf(i);
Pattern p = Pattern.compile("1+");
Matcher m = p.matcher(s);
while (m.find()){
len+=m.group().length();
}
}
return len;
}
}
8.java 计算x的n次方
package mathtest;
/*
*Java 实现 x 的 y 次方
*
* */
public class PowerTest {
public static void main(String[] args) {
int m=-2;
double result = power(3, -2);
if(m > 0){
System.out.println(result);
}else {
result= m%2==0?(1/result):(-1/result);
System.out.println(result);
}
}
private static double power(int n, int m) {
double temp = 0;
if (m == 0) return 1;
if (m == 1) return n;
if (Math.abs(m) > 0) {
temp = power(n, m / 2);
temp = m % 2 == 0 ? temp * temp : temp * temp * n;
}
return temp;
}
}
9.给定一个 24 小时制(小时:分钟)的时间列表,找出列表中任意两个时间的最小时间差并已分钟数表示
package mathtest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*
* 给定一个 24 小时制(小时:分钟)的时间列表,找出列表中任意两个时间的最小时间差并已分钟数表示
* */
public class SolutionTest {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("23:55");
list.add("00:55");
list.add("10:00");
list.add("11:00");
System.out.println(findMinDifference(list));
}
public static int findMinDifference(List<String> list){
int[] time = new int[list.size()];
int num=0;
for(String s: list){
time[num]=60*((s.charAt(0)-'0')*10+s.charAt(1)-'0')+(s.charAt(3)-'0')*10+s.charAt(4)-'0';
num++;
}
Arrays.sort(time);
int min=time[1] - time[0];
for(int i = 0;i<time.length-1;i++){
if(time[i+1]-time[i]<min) min=time[i+1]-time[i];
}
return min;
}
}
代码参考:
https://blog.csdn.net/zeromaxhe/article/details/92017020
10.给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
package mathtest;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/*
* 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
* 字符串:abcabcbb ,无重复的最长字串是abc,返回长度是3
* */
public class StringTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int len = lengthOfLongestString(str);
System.out.println(len);
}
public static int lengthOfLongestString(String str){
int max =0;
if(str == null || str.length()==0){
return 0;
}
Set<Character> set = new HashSet<>();
for(int i=0;i<str.length();i++){
if(!set.contains(str.charAt(i))){
set.add(str.charAt(i));
max=max<set.size()?set.size():max;
}else {
set.removeAll(set);
set.add(str.charAt(i));
}
}
return max;
}
}