笔试练习题 - 每日一题

选择题

Java基础知识题型总结

第一题

在 Java 中,存放字符串常量的对象属于( )类对象。
A. Character
B. String
C. StringBuffer
D. Vector

此题的答案应该选B
解析:
此题的错误答案应该集中在C上,我们在编译器上运行可以看到字符串常量不能之间赋值给StringBuffer的。
在这里插入图片描述

第二题

已知如下类定义:

class Base { 
 public Base (){
 //...
 } 
 public Base ( int m ){
 //...
 } 
 public void fun( int n ){
 //...
 }
} 
public class Child extends Base{ 
 // member methods 
}

如下哪句可以正确地加入子类中?
A. private void fun( int n ){ //…}
B. void fun ( int n ){ //… }
C. protected void fun ( int n ) { //… }
D. public void fun ( int n ) { //… }

此题的答案应该选D
此题的考点是重写的概念,重写时子类的方法名、返回值与参数都必须与父类相同,而访问限定符需要大于等于父类,此时父类中的fun()方法使用public修饰,那么观察答案,只有D符合题意。

第三题

下列选项中属于面向对象编程主要特征的是()
A. 继承
B. 自顶向下
C. 模块化
D. 逐步求精

此题答案为A
非常简单:面向对象编程的三大特性为,继承,封装与多态,而题目中说的自顶向下、模块化、逐步求精都是结构化程序设计的原则

第四题

关于下列程序段的输出结果,说法正确的是:( )

public class MyClass{
	static int i;
	public static void main(String argv[]){
		System.out.println(i);
	}
}

A. 有错误,变量i没有初始化。
B. null
C. 1
D. 0

此题答案为D
成员变量没有手动初始化时,会初始化为默认值,此时i的类型为int默认初始化的值为0。

第五题

下列代码的执行结果是:( )

public class Test{
	 public static void main(String args[]){
		System.out.println(100%3);
		System.out.println(100%3.0);
	 }
}

A. 1和1
B. 1和1.0
C. 1.0和1
D. 1.0和1.0

此题答案为B
此题考查Java中求余数,在Java中求余数时可以为小数求余数,100%3余数为1,因为两个操作数都是整数所以结果也是整数,而100%3.0有一个操作数为浮点数,答案也是浮点数为1.0,所以选B。

第六题

方法通常存储在进程中的哪一区()
A. 堆区
B. 栈区
C. 全局区
D. 方法区

此题答案选D

第七题

不考虑反射,关于私有访问控制符 private 修饰的成员变量,以下说法正确的是()
A. 可以三种类所引用:该类自身、与它在同一包中的其他类,在其他包中的该类的子类
B. 可以被两种类访问和引用:该类本身、该类的所有子类
C. 只能被该类自身所访问和修改
D. 只能被同一个包中的类访问

此题答案选C
private 访问控制符表示私有的,只能在当前类中进行访问,所以选C。

第八题

类声明中,声明一个类不能再被继承的关键字是()
A. public
B. abstract
C. final
D. static

此题答案为C
public 不用说,abstract表示抽象类,抽象类中的抽象方法必须在子类中实现所以可以被继承,static表示静态的,而final修饰的类是不可以被继承的。
在这里插入图片描述

** 第九题**

假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?()

public class A {
	public int i;
	static String s;
	void method1(){}
	static void method2(){}
}

A. System.out.println(a.i);
B. a.method1();
C. A.method1();
D. A.method2();

此题答案为C
通过对象调用成员变量和成员方法没有问题,所以AB正确,D使用类名调用静态方法也没有问题,C使用类名调用普通方法显然是错误的。

第10题

下面的代码输出结果是啥()
A. true
B. false
C. 1
D. 编译错误

public class SystemUtil{
	public static boolean isAdmin(String userId){
		return userId.toLowerCase()=="admin";
	}
	public static void main(String[] args){
		System.out.println(isAdmin("Admin"));
	}
}

答案为B
解析:通过查看toLowerCase();这个方法的源码知道,如果字符串不进行任何字符的改变那么返回的是return this;,如果字符串通过这个方法发生了改变返回的则是return new String(result, 0, len + resultOffset);,此时为new的字符串自然与字符串常量池中的字符串的引用不一样,所以使用==判断返回false

第11题

下面代码的结果是什么()
A. 0
B. 1
C. 2
D. 编译失败

public class Test {
	public int aMethod(){
		static int i = 0;
		i++;
		return i;
	}
	public static void main(String args[]){
		Test test = new Test();
		test.aMethod();
		int j = test.aMethod();
		System.out.println(j);
	}
}

此题答案为D
解析:static不可以修饰局部变量,因为static修饰的变量为类变量舒服类不属于方法。

第12题

下列说法正确的有:()
A. class中的constructor不可省略
B. constructor必须与class同名,但方法不能与class同名
C. constructor在一个对象被new 时执行
D. 一个class只能定义一个constructor

此题答案为C
解析:A构造方法可以省略,Java会提供无参的构造方法,B可以同名,D构造方法可以重载。

第13题

下列Java代码中的变量a、b、c分别在内存的____存储区存放。

class A {
    private String a = “aa”;
    public boolean methodB() {
        String b = “bb”;
        final String c = “cc”;
    }
}

A.堆区、堆区、堆区
B.堆区、栈区、堆区
C.堆区、栈区、栈区
D.堆区、堆区、栈区
E.静态区、栈区、堆区
F.静态区、栈区、栈区

此题答案为C
解析:应用类型存放在堆上,全局遍历存储在堆上,局部遍历存储在栈上。

第14题

有代码片段如下:

byte b1=1,b2=2,b3,b6;  
final byte b4=4,b5=6;  
b6=b4+b5;  
b3=(b1+b2);  
System.out.println(b3+b6);

关于上面代码片段叙述正确的是()
A.输出结果:13
B.语句:b6=b4+b5编译出错
C.语句:b3=b1+b2编译出错
D.运行期抛出异常

此题答案选择C
在进行+操作时会将类型byte -> int,此时final修饰的b4 b5不会改变,而b1 + b2 在计算时会将结果的类型变为int,与b3类型不匹配,导致编译出错。

第15题

如下代码,执行test()函数后,屏幕打印结果为()

public class Test2
{
    public void add(Byte b)
    {
        b = b++;
    }
    public void test()
    {
        Byte a = 127;
        Byte b = 127;
        add(++a);
        System.out.print(a + " ");
        add(b);
        System.out.print(b + "");
    }
}

A.127 127
B.128 127
C.129 128
D.其他选项都不对

此题答案选择 D
add(++a)进入add方法后,形参的改变不影响实参本身,执行完add方法后++a,因为byte的取值范围是-128-127所以最高位为符号为127 + 1后变为-128add(b)同理,所以最后输出的值为-128 127

第16题

下列程序的运行结果

public void getCustomerInfo() {
        try {
            // do something that may cause an Exception
        } catch (java.io.FileNotFoundException ex) {
            System.out.print("FileNotFoundException!");
        } catch (java.io.IOException ex) {
            System.out.print("IOException!");
        } catch (java.lang.Exception ex) {
            System.out.print("Exception!");
        }
    }

A.IOException!
B.IOException!Exception!
C.FileNotFoundException!IOException!
D.FileNotFoundException!IOException!Exception!

此题答案为 A
只会抛出一个异常不会抛出多个

第17题

下列哪个修饰符可以使在一个类中定义的成员变量只能被同一包中的类访问?
A.private
B.无修饰符
C.public
D.protected

此题答案为 B
在这里插入图片描述

数据库

第1题

在Mysql中,订单表 ( 订单号,雇员代号,地区代号,订购日期 ) 中订单号为主键,要删除订单中前三年以前的信息, SQL 为:
A. delete from 订单表 where 订购日期<getdate()+3
B. delete from 订单表 where 订购日期<DATEADD(yy,3,getdate())
C. delete from 订单表 where 订购日期<getdate()-3
D. delete from 订单表 where 订购日期<DATEADD(yy,-3,getdate())

此题答案为D
解析:getdata()获取的类型是日期,日期类不支持加减,DATEADD(datepart,number,data),datepart表示日期的类型年月日,number该数字为正向后推,该数字为负向前推,data参数是合法的日期表达式。

第2题

负责数据库中查询操作的数据库语言是( )。
A. 数据定义语言
B. 数据管理语言
C. 数据操纵语言
D. 数据控制语言

此题答案选C
解析:数据定义语言DDL创建操作,数据操纵语言DML,主要负责数据的基本操作,增删查改,数据控制语言DCL用于授权或回收访问数据库的某种特权。

第3题

在sql数据库中,哪个语句能校验整数列 i 的值不小于 1 不大于 10 ?
A. i BETWEEN 1 AND 10
B. i BETWEEN 0 AND 11
C. i IN INTERVAL(0,11)
D. i IN INTERVAL(1,10)

此题答案为A
解析:between and 为[],INTERVAL()是一个比较函数,当第一个数之后的按升序排列才会生效,返回第一个数之后小于等于第一个数的个数。

第4题

SQL 查询语句中 WHERE 、 GROUP BY 、 HAVING 这些关键字区别和用法总结错误的是()
A. HAVING在查询语句中必须依赖于GROUP BY
B. WHERE子句用来限制SELECT语句从表中指定选取的行
C. GROUP BY子句用来分组WHERE子句的输出结果集
D. HAVING子句用来从分组的结果中筛选列

此题答案为:D
解析:WHERE 分组前筛选,HAVING 分组后过滤,过滤的为行。

第5题

给出数据表 score(stu-id,name,math,english,Chinese), 下列语句正确的是( )
A. Select sum(math),avg(chinese) from score
B. Select *,sum(english) from score
C. Select stu-id, sum(math) from score
D. Delete * from score

此题答案选择A
解析:聚合函数在查询时会合并行,所以所查字段必须都是合并过的,故BC错误,D语法错误。

第6题

在Mysql中,语句 SELECT IF(-1,5,2) 的返回值是:
A. 2
B. 6
C. -1
D. 5

此题答案选择D
解析:if语句如果第一个数字非0,返回第二个参数,否则返回第三个参数。

第7题

设有两个事务T1,T2,其并发操作如下所示,下面评价正确的是()
步骤 T1 T2
1 读A=100 2 读A=100
3. A=A+10写回 4. A=A-10写回

A. 该操作不能重复读
B. 该操作不存在问题
C. 该操作读"脏"数据
D. 该操作丢失修改

该题选择D
解析:不可重复读表示修改数据前读取数据一次,修改后读取一次,两次读取的结果不一样,脏读问题表示,修改数据后读取,但是修改失败数据回滚了。

第8题

学生关系模式S(S#,Sname,Sex,Age),S的属性分别表示学生的学号、姓名、性别、年龄。要在表S中删除一个属性“年龄”,可选用的SQL语句是()
A. ALTER TABLE S DROP Age
B. ALTER TABLE S ‘Age’
C. UPDATE S Age
D. DELETE Age from S

此题答案选择A
解析:修改字段使用ALTER。

第9题

下列sql语句中哪条语句可为用户zhangsan分配数据库userdb表userinfo的查询和插入数据权限()。
A. grant select,insert on userdb.userinfo to’zhangsan’@‘localhost’
B. grant’zhangsan’@‘localhost’to select,insert for userdb.userinfo
C. grant select,insert on userdb.userinfo for’zhangsan’@‘localhost’
D. grant’zhangsan’@'localhost’to userdb.userinfo on select,insert

此题答案选择A
解析:授予用户某张表的权限:grant sql语句 on 数据库名.表名 to 用户名@'该用户允许访问的IP'

第10题

athletes 表包含运动员姓名,年纪和代表国家。下面哪个查询可以找出代表每个国家最年轻的运动员情况?
A. SELECT name, country, age FROM athletes WHERE (country, age) IN (SELECT country, min(age) FROM athletes GROUP BY country)
B. SELECT name, country, age FROM athletes WHERE (country, age) IN (SELECT min(age), country FROM athletes GROUP BY country)
C. SELECT name, country, age FROM athletes WHERE (country, age) IN (SELECT country, min(age) FROM athletes) GROUP BY country
D. SELECT name, country, age FROM athletes WHERE age IN (SELECT country, min(age) FROM athletes GROUP BY country)

此题答案选择A
解析:字段 in(子查询) 字段可以有1个或者多个,但是字段需要和子查询结果集字段的数量,顺序一致。

第11题

在Sql server中,以下哪一句从表TABLE_NAME中提取前10条记录?
A. select * from TABLE_NAME where rowcount=10
B. select TOP 10 * from TABLE_NAME
C. select TOP of 10 * from TABLE_NAME
D. select * from TABLE_NAME where rowcount<=10

此题答案选择B
解析:语法 select top n 查询字段 from

第12题

电话号码表t_phonebook中含有100万条数据,其中号码字段PhoneNo上创建了唯一索引,且电话号码全部由数字组成,要统计号码头为321的电话号码的数量,下面写法
执行速度最慢的是___
A. select count() from t_phonebook where phoneno >= ‘321’ and phoneno < ‘321A’
B. select count(
) from t_phonebook where phoneno like ‘321%’
C. select count(*) from t_phonebook where substr(phoneno,1,3) = ‘321’
D. 都一样快

此题答案选择C
解析:AB都可以使用索引,C不会使用到索引,全表扫描。A:phoneno是数字组成的,和字符串可以比较,但是会进行类型转换。B:模糊匹配可以使用索引。

代码题

数组排序类

链接: 组队竞赛 - 牛客网

题目:
牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
例如:
一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
如样例所示:
如果牛牛把6个队员划分到两个队伍
如果方案为:
team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7.
而如果方案为:
team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10.
没有比总和为10更大的方案,所以输出10.

通过读题我们发现了一句最重要的话牛牛发现队伍的水平值等于该队伍队员中第二高水平值。这句话非常重要,通过这句话我们可以找到解题的关键,如果我们想让队伍的水平总和最大那么我们需要让每个队伍的水平值最大,我们在进行分配队伍时,每次分配一个水平值最低的队员和两个最大的队员,问题就解决了。
在这里插入图片描述
通过我们的分析找到了一些规律,我们先将队员的水平值放入一个数组中进行排序,每次取出都是该数组中的最小元素、最大元素、和次大元素,而次大元素就是每个队伍的水平值,通过对该这组次大元素下标的分析,我们找到了规律。
下面是题解:

  public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        long[] arr = new long[3 * n];

        for(int i = 0;i < arr.length;i++) {
            arr[i] = scanner.nextInt();
        }

        long count = 0;

        for(int i = 0;i < n;i++) {
            count += arr[arr.length - 2 * (i +1)];
        }

        System.out.println(count);
    }

链接: 排序子序列

解题思路:把题目翻译成人话就是,在一个数组中找递增或者递减区间并把他们分成一组,求最后可以分几组。非常简单,我们只需要找到递增区间与递减的区间交换的位置,并把计数器加1就可以了,注意,为了防止数组越界访问,我们在初始化数组时多初始化一位。

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) {
            int n = in.nextInt();
            int[] arr = new int[n + 1];
            for (int i = 0; i < n; i++) {
                arr[i] = in.nextInt();
            }

            int i = 0;
            int count = 0;
            while (i < n) {
                if (arr[i] < arr[i + 1]) {
                    while (i < n && arr[i] < arr[i + 1]) {
                        i++;
                    }
                    count++;
                    i++;
                } else if (arr[i] == arr[i + 1]) {
                    i++;
                } else {
                    while (i < n && arr[i] > arr[i + 1]) {
                        i++;
                    }
                    count++;
                    i++;
                }
            }
            System.out.println(count);
        }
    }
}

字符串类

链接: 删除公共字符串 - 牛客网

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
输入描述:
每个测试输入包含2个字符串
输出描述:
输出删除后的字符串

我们通过分析可以将这个题变成找重复元素,找到str1中与str2重复的元素删除并输出删除重复字符后的字符串,我们可以直接遍历字符串,找到重复元素后替换为"",我们还可以使用更高级的一些方法例如HashMapHashMap<Character,Integer> map = new HashMap<>();我们可以创建一个这样的HashMap,遍历str2,将字符作为key存入HashMap中,并给value++,遍历完str2之后,在遍历str1如果str1中的字符作为key所对应的value为0,那就输出,如果不为0就说明在str2中重复,不输出。

 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        HashMap<Character,Integer> map = new HashMap<>();

        String str1 = scanner.nextLine();
        String str2 = scanner.nextLine();

        for(int i = 0;i < str2.length();i++) {
            if(map.get(str2.charAt(i)) == null) {
                map.put(str2.charAt(i),1);
            }else {
                map.put(str2.charAt(i),map.get(str2.charAt(i)) + 1);
            }
        }

        String ret = "";

        for(int i = 0;i < str1.length();i++) {
            if(map.get(str1.charAt(i)) == null) {
                ret += str1.charAt(i);
            }
        }

        System.out.println(ret);
    }

其他类

链接: 二进制插入

解析:我们需要将 m 的二进制位像左移动j位,之后与n进行|操作就可以了

在这里插入图片描述
代码实现:

  public int binInsert(int n, int m, int j, int i) {
        m = m << j;
        return m|n;
    }

链接: 另类加法

解题思路:
1、二进制位相异或的结果,是两个数对应位相加的结果,不考虑进位。
2、二进制位与后移一位的结果,是两个数相加进位的结果(只考虑进位)。

代码实现:

public static int addAB(int A, int B) {
        // write code here
        while(B != 0) {
            int i = A ^ B;
            int j = A & B;
            j = j << 1;
            A = i;
            B = j;
        }
        return A;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悲伤猪小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值