笔试强训day5

文章目录

    • 一、选择题
    • 二、编程题

一、选择题

1、下面的程序 编译运行后,在屏幕上显示的结果是()

public class Test {
public static void main(String args[]) {
int x, y;
x = 5 >> 2;
y = x >>> 2;
System.out.println(y);
}
}

A 0
B 2
C 5
D 80
他的回答: A (正确)
正确答案: A
参考答案:
5 >> 2 相当于 5除于2两次,等于1 ,>>> 表示无符号右移,高位用0 填充,0001右移两位 0000,所以选A
2、以下代码结果是什么?

public class foo {
public static void main(String sgf[]) {
StringBuffer a=new StringBuffer("A");
StringBuffer b=new StringBuffer("B");
operate(a,b);
System.out.println(a+"."+b);
}
static void operate(StringBuffer x,StringBuffer y) {
x.append(y);
y=x;
}
}

A 代码可以编译运行,输出“AB.AB”。
B 代码可以编译运行,输出“A.A”。
C 代码可以编译运行,输出“AB.B”。
D 代码可以编译运行,输出“A.B”。
他的回答: A (错误)
正确答案: C
参考答案:
作对这道题的关键是要理解Java的值传递,关于值传递和引用传递的解释如下:
值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。这道题中a、b(是引用的副本,Java中没有引用传递)传入operate()函数中,但最后a指向的对象的值发生了变化,而b指向的对象的值没有发生变化,这是因为x.append(y);改变了a指向的对象的值,而y=x;并没有改变b指向对象的值,指向将y指向了x所指向的对象(之前y和b指向同一个对象)。
3、在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为()
A this.A(x)
B this(x)
C super(x)
D A(x)
他的回答: A (错误)
正确答案: B
参考答案:
this(x)代表调用当前类的其它构造方法;this.A(x)只能调用其它的普通方法和成员变量;super(x)是调用父类的构造方法。
4、下面代码的运行结果是()

public static void main(String[] args){
String s;
System.out.println("s="+s);
}

A 代码编程成功,并输出”s=”
B 代码编译成功,并输出”s=null”
C 由于String s没有初始化,代码不能编译通过。
D 代码编译成功,但捕获NullPointException异常
他的回答: B (错误)
正确答案: C
参考答案:
这里的S是局部变量,必须要初始化,否侧编译不通过。
5、在java7中,下列不能做switch()的参数类型是?
A int型
B 枚举类型
C 字符串
D 浮点型
他的回答: D (正确)
正确答案: D
参考答案:不能做switch()参数的有float,double,long,blooean
6、一个以”.java”为后缀的源文件
A 只能包含一个类,类名必须与文件名相同
B 只能包含与文件名相同的类以及其中的内部类
C 只能有一个与文件名相同的public类,可以包含其他类
D 可以包含任意类
他的回答: C (正确)
正确答案: C
参考答案:
可以有很多类,只有public修饰的类才要求与类名相同。
7、以下代码返回值是什么?

public boolean returnTest()
{
try
{
return true;
}
catch (Exception e)
{
}
finally
{
return false;
}
}

A true
B false
他的回答: A (错误)
正确答案: B
参考答案:在这个语句块中,有finally是最后执行的,所以返回false,如果没有finally就会返回true。
8、以下()不是合法的标识符?
A STRING
B x3x
C void
D deSf
他的回答: C (正确)
正确答案: C
参考答案:标识符可以由数字,字符,下划线,美元符号(不推荐)组成。
9、指出以下程序运行的结果是

public class Example{
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
//引用类型变量,传递的是地址,属于引用传递。
str="test ok";
ch[0]='g';
}
}

A good and abc
B good and gbc
C test ok and abc
D test ok and gbc
他的回答: A (错误)
正确答案: B
10、下列有关JAVA异常处理的叙述中正确的是()
A finally是为确保一段代码不管是否捕获异常都会被执行的一段代码
B throws是用来声明一个成员方法可能抛出的各种非运行异常情况
C final用于可以声明属性和方法,分别表示属性的不可变及方法的不可继承
D throw是用来明确地抛出一个异常情况
他的回答: A B C (错误)
正确答案: A B D
参考答案:
C选项方法的不能被重写

二、编程题

【统计回文】“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她
得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少
种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:

  • 在A的第一个字母之前: “baba” 不是回文
  • 在第一个字母‘a’之后: “abba” 是回文
  • 在字母‘b’之后: “abba” 是回文
  • 在第二个字母’a’之后 “abab” 不是回文
    所以满足条件的答案为2
    输入描述:
    每组输入数据共两行。
    第一行为字符串A
    第二行为字符串B
    字符串长度均小于100且只包含小写字母
    输出描述:
    输出一个数字,表示把字符串B插入字符串A之后构成一个回文串的方法数
    示例1:
    输入
    aba
    b
    输出
    2
    【解题思路】:
    本题使用暴力求解方式计算即可,遍历str1,将str2 insert进入str1的每个位置,判断是否是回文,这里注意的是,判断回文的时候,直接将字符串逆置,看是否相同就好了。是就++count;需要注意的是这里不neng能str1.insert(i, str2),这样的话str1改变了,判断下一个位置就不对了。所以每次使用str1重新给一个str,然后str.insert(i, str2),再判断。
    笔试强训day5_第1张图片
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String str1=sc.nextLine();
        String str2=sc.nextLine();
        int count=0;
        for (int i=0;i<=str1.length();i++){
            // 将字符串2插入到字符串1的每个位置,再判断是否是回文
            StringBuffer str=new StringBuffer(str1);
            str.insert(i,str2);
            //注意这里,不能直接StringBuilder str5 = str.reverse();
            //因为这样str本身又变了。
            StringBuffer tmp=new StringBuffer(str);
            StringBuffer str3=tmp.reverse();
            if(str3.toString().equals(str.toString())){
                count++;
            }
        }
        System.out.print(count);
    }
}

**【连续最大和】**一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
输入描述:
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:
所有连续子数组中和最大的值。
示例1:
输入
3 -1 2 1
输出
3
【解题思路】:
状态方程式: max( dp[ i ] ) = getMax( max( dp[ i -1 ] ) + arr[ i ] ,arr[ i ] )
dp[i] 就是以数组下标为i 的数做为结尾的最大子序列和,注意是以i 为结尾,比如说现在有一个数组{6,-3,-2,7,-15,1,2,2},dp[2]就是以-2为结尾的,那么显然dp[3]的最大值就是1咯(6,-3,-2),dp[3]要以7结尾那么以7结尾的子序列最大和就是8(6,-3,-2,7)。现在我们开始细细品一下上面这个递推式,求dp[i]的时候是不是有两种可能,要么就是像上面的dp[3]一样,dp[2]求出来是1了,再加上自array[3]是最大的,那么还有一种可能就是说如果dp[2]我求出来是-100,那如果我也是dp[2]+array[3]的话是-93, 这时候dp[2]反而是累赘,最大就是自己(因为前面定义了必须以i为结尾,也就说必须以7结尾)。

import java.util.*;
public class Main{
    public static int getMax(int a,int b){
        return (a)>(b)?(a):(b);
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        int[] array=new int[n];
        for(int i=0;i<n;i++){
            array[i]=sc.nextInt();
        }
        int sum=array[0];
        int max=array[0];
        for(int i=0;i<n;i++){
             sum=getMax(sum+array[i],array[i]);
            if(sum>=max){
               max=sum;
            }
        }
          System.out.print(max);
    }
}

你可能感兴趣的:(笔试强训,java)