测试面试题4

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;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值