【笔试训练】查找字符串中最长的数字串和数组中出现次数超过一半的数字

目录

一、选择题

二、字符串中找出连续最长的数字串 

三、数组中出现次数超过一半的数字


一、选择题

1、以下程序的输出结果为

class Base{
     public Base(String s){
         System.out.print("B");
     }
}
 public class Derived extends Base{
     public Derived (String s) {
         System.out.print("D");
     }
     public static void main(String[] args){
         new Derived("C");
     }
}

A. BD         B. DB             C. C              D. 编译错误


答案:D

父类Base里面存在一个有参的构造方法,所以子类在继承了Base之后,就需要在子类的构造方法中,调用父类构造方法,并且传递参数,但是题中没有这个操作。所以编译不会通过。

2、下列描述错误的是() 

A. SQL语言又称为结构化查询语言

B. java中”static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问

C. 面向对象开发中,引用传递意味着传递的并不是实际的对象,而是对象的引用,因此,外部对引用对象所做的改变不会反映到所引用的对象上

D. java是强类型语言,javascript是弱类型语言

E. 面向对象的三大特性包括:封装,继承,多态


答案:C

c选项错误的原因是,当你将一个对象的引用传递给另一个变量,这个时候接收这个引用的变量,可以通过引用修改对象中的值。

 

Java是强类型的语言,这个意思就是,在Java中,对一个数字的类型有着严格的检查,而在JavaScript中,每个类型的对象都可以使用var或者let.

3、Java程序中的类名名称必须与存在该类的文件名相同()

 A. 对          B. 错


答案:B

这是因为在文件中可能存在多个类,但是只有一个使用public修饰的类且与文件同名,其他类不能使用访问限定修饰符修饰,这种情况是,其余的类不是这个public修饰的类的子类。

但是在这个public修饰的类中的内部类可以使用访问修饰限定符修饰。

二、字符串中找出连续最长的数字串 

 

题目解析 :使用for循环遍历这个字符串,如果遇到数字,则使用count变量记录,遍历到连续数字的个数,如果一串数字遍历完,遇到的下一个字符为字母,则将count置0,用来记录下一次遍历到的数字串的长度。

当第一次将一组数字串遍历完成之后,就需要使用max记录这组数字串的长度,当下次遍历到一组数字串之后,就使用max与count比较,当count比max大,则将count中的值传递给max,相应的使用end变量来记录最长数字串的最后一个数字的下标,也就是i遍历到的位置。

最后使用字符串截取函数substring将最长数字串截取出来。由于substring函数的参数范围是左闭右开,所以需要在end的基础上加1,作为右区间,左区间是end-max+1,是因为使用end-max表示的是数字串第一个数字字符的前一位,需要加1表示数字串的第一位。

public class Main{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        int count = 0;//记录每次遍历到的数字串的个数
        int max = 0;//用来记录最大数字串长度
        int end = 0;//用来记录最长数字串的最后一位
        for (int i = 0; i < str.length(); i++) {
            //判断符合数字是,进入,i每遍历到一个字符判断一次
            if (str.charAt(i) >= '0' &&str.charAt(i) <= '9'){
               //每遍历到一个数字时,使用count记录一次,将长度与max进行比较
                count++;
                if(max < count){
                    max = count;
                    //当遍历到一个数字串的长度已经超过了max的长度,就需要end记录i遍历到的位置。
                    end = i;

                }
            }else{//如果是字母,则需要将count归0,用来记录下一个数字串的长度。
                count = 0;
            }
        }
        //将整个字符串最长数字串截取出来。
        System.out.println(str.substring(end-max+1,end+1));
    }

}

三、数组中出现次数超过一半的数字

 题目解析:如果一组字符串中一个数字出现的次数超过数组长度的一半,则先将这个数组排序,然后再将找到数组的中间元素,就是要找的数字。

代码思路:使用for循环遍历,要到题目要求的数字,就需要两个条件,一是这个数字等于数组中间元素,另一个是这个等于数组中间元素的值需要超过数组长度的一半。

public class Main{
    public static int func(char[] str){
        //1.先排序数组
        Arrays.sort(str);
        //2、计算数组中间位置
        int len = str.length/2;
        int count = 0;//使用count记录i遍历到的数字等于str[len]的次数
        for (int i = 0; i < str.length; i++) {
            //3、判断i下标所指的数字和中间的数字是否相同,相同记录次数
            if(str[i] == str[len]){
                count++;
            }
        }
        //4、判断与len指定位置元素相同,且出现次数超过一半
        if(count > len){
            return str[len];//直接返回中间元素
        }else{
            return 0;//没有达到条件,返回0
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值