Bootstrap

【Java每日一题】Java笔试100题(2)

1. 句子逆序

题目描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
接口说明
/**
反转句子
*
*@param sentence 原句子
*@return 反转后的句子
*/
public String reverse(String sentence);
输入描述:
将一个英文语句以单词为单位逆序排放。
输出描述:
得到逆序的句子
在这里插入图片描述

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        String[] arrayStr = str.split(" ");//用split()分割成一个字母为一个String的数组
        StringBuilder sb = new StringBuilder();
        for(int i = arrayStr.length -1 ; i >=0 ; i--){
            sb.append(arrayStr[i] + " ");//每个字母后要加空格
        }
        System.out.println(sb);
    }
}
2.下面有关TCP协议的描述,说法错误的是?

(百度笔试题)

A. TCP使用窗口机制进行流量控制
B. 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭,需要四次握手
C. TCP连接建立需要三次握手
D. 被动关闭socket后,会进入到TIME_WAIT状态

解析:
被动关闭进入CLOSED状态,主动关闭进入TIME_CLOSED状态。

3. tcp三次握手的过程,accept发生在三次握手哪个阶段?

(腾讯笔试题)

A. 第一次握手
B. 第二次握手
C. 第三次握手
D. 三次握手后

解析:
在这里插入图片描述
第一次握手:客户端发送syn包(syn=j)到服务器。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。
三次握手完成后,客户端和服务器就建立了tcp连接。这时可以调用accept函数获得此连接。

4. int listen(SOCKET s, int backlog);该函数中第二个参数的含义是?

(阿里巴巴2016笔试题)

A. 是否打开log信息
B. 是否打开后台log信息
C. 后台等待连接队列的最大限制值
D. 后台等待连接队列的最小限制值
E. 无意义

5.字符串加解密

1、对输入的字符串进行加解密,并输出。
2加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
其他字符不做变化。
3、解密方法为加密的逆过程。
接口描述:
实现接口,每个接口实现1个基本操作:
void Encrypt (char aucPassword[], char aucResult[]):在该函数中实现字符串加密并输出
说明:
1、字符串以\0结尾。
2、字符串最长100个字符。
int unEncrypt (char result[], char password[]):在该函数中实现字符串解密并输出
说明:
1、字符串以\0结尾。
2、字符串最长100个字符。
输入描述:
输入说明
输入一串要加密的密码
输入一串加过密的密码
输出描述:
输出说明
输出加密后的字符
输出解密后的字符
在这里插入图片描述

import java.util.*;
public class Main {
    
    public static char encryption(char c){
        if(c >= 'a' && c < 'z')
            return (char)(c + 1 - 32);
        else if(c == 'z')
            return 'A';
        else if(c >= 'A' && c < 'Z')
            return (char)(c + 1 + 32);
        else if(c == 'Z')
            return 'a';
        else if(c >= '0' && c < '9')
            return (char)(c + 1);
        else if(c == '9')
            return '0';
        else
            return c;
    }
     
    public static char decryption(char c){
        if(c > 'a' && c <= 'z')
            return (char)(c - 1 - 32);
        else if(c == 'a')
            return 'Z';
        else if(c > 'A' && c <= 'Z')
            return (char)(c - 1 + 32);
        else if(c == 'A')
            return 'z';
        else if(c > '0' && c <= '9')
            return (char)(c - 1);
        else if(c == '0')
            return '9';
        else
            return c;
    }
     
    public static String enCryption(String s){
        char[] cs = s.toCharArray();
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < cs.length; i++){
            sb.append(encryption(cs[i]));
        }
        return sb.toString();
    }
     
    public static String deCryption(String s){
        char[] cs = s.toCharArray();
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < cs.length; i++){
            sb.append(decryption(cs[i]));
        }
        return sb.toString();
    }
     
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String s1 = sc.nextLine();
            String s2 = sc.nextLine();
            System.out.println(enCryption(s1));
            System.out.println(deCryption(s2));
        }
        sc.close();
    }
}
6. 骆驼命名法

题目描述:
从C/C++转到Java的程序员,一开始最不习惯的就是变量命名方式的改变。C语言风格使用下划线分隔多个单词,例如“hello_world”;而Java则采用一种叫骆驼命名法的规则:除首个单词以外,所有单词的首字母大写,例如“helloWorld”。
请你帮可怜的程序员们自动转换变量名。
输入描述:
输入包含多组数据。
每组数据一行,包含一个C语言风格的变量名。每个变量名长度不超过100。
输出描述:
对应每一组数据,输出变量名相应的骆驼命名法。
在这里插入图片描述

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String str = in.next();
            char[] array = str.toCharArray();
            int i = 0;
            StringBuilder sb = new StringBuilder();
            while(i < array.length){
                if(array[i] != '_'){
                    sb.append(array[i]);
                    i++;
                } else {
                    i++;
                    sb.append((array[i]+"").toUpperCase());
                    i++;
                }
            }
            System.out.println(sb.toString());
        }
    }
}

7.【中级】单词倒排

题目描述:
对字符串中的所有单词进行倒排。
说明:
1、每个单词是以26个大写或小写英文字母构成;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
输入描述:
输入一行以空格来分隔的句子
输出描述:
输出句子的逆序
在这里插入图片描述


//注意这里不能使用 split(" ")
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String[] array = str.split("[^a-zA-Z]+");
        for(int i = array.length-1 ; i > 0; i--){
            System.out.print(array[i] + " ");
        }
        System.out.print(array[0]);
        System.out.println();
    }
}


8. 在一个含有group by的查询sql中,同时存在having和where,sql在解析执行的时候,先执行的是哪一个?

(摩拜2018校招)

A. having
B. where

解析:
执行顺序:where,group by,select ,having,order by

9. 语句 SELECT IF(-1,5,2) 的返回值是:

A. 2
B. 6
C. -1
D. 5

解析:
就是三目运算符,非0为真,所以-1为真,结果为5

10. 学生关系模式S(S#,Sname,Sex,Age),S的属性分别表示学生的学号、姓名、性别、年龄。要在表S中删除一个属性“年龄”,可选用的SQL语句是()

(凤凰网2017秋招)

A. ALTER TABLE S DROP Age
B. ALTER TABLE S ‘Age’
C. UPDATE S Age
D. DELETE Age from S

11. 在关系型是数据库中,有两个不同的事务同时操作数据库中同一表的同一行,不会引起冲突的是:

(阿里巴巴2017秋招)

A. 其中一个DELETE操作,一个是SELECT操作
B. 其中两个都是UPDATE
C. 其中一个是SELECT,一个是UPDATE
D. 其中一个SELECT
E. 其中一个是DELETE,另一个是UPDATE
F. 两个都是DELETE

解析:
当要删除的元素不存在时,是不会报错的

12. 以下哪个不是与Mysql服务器相互作用的通讯协议()

(网易2016校招)

A. TCP/IP
B. UDP
C. 共享内存
D. Socket

解析:
与Mysql服务器相互作用的通讯协议包括TCP/IP、Socket、共享内存、命名管道

13.数组中出现次数超过一半的数字

题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        Arrays.sort(array);
        int count = 0;
        int flag = array[array.length/2];
        for(int i = 0 ; i < array.length ; i++){
            if(array[i] == flag){
                count++;
            }
        }
        if(count > array.length/2){
            return flag;
        }
        return 0;
    }
}
14.有订单表orders,包含字段用户信息userid,字段产品信息productid,以下语句能够返回至少被订购过两次的productid?()

(用友2018秋招)

A. select productid from orders where count(productid)>1
B. select productid from orders where max(productid)>1
C. select productid from orders where having count(productid)>1 group by productid
D. select productid from orders group by productid having count(productid)>1

解析: where和having不能一起使用

15. 下面哪个SQL命令用来向表中添加列()

(凤凰网2015校招)

A. MODIFY TABLE TableName ADD COLUMN ColumnName
B. MODIFY TABLE TableName ADD ColumnName
C. ALTER TABLE TableName ADD COLUMN ColumnName
D. ALTER TABLE TableName ADD ColumnName Type

解析:
表中添加列:alter table tableName add columnName Type
表中删除列:alter table tableName drop column columnName

16.执行以下 SQL ,下面哪个名字会被查询出来()

(摩拜2018校招)

SELECT FirstName FROM StaffList WHERE FirstName LIKE’_A%

A. Allen
B. CLARK
C. JACKSON
D. David

17. 下列sql语句中哪条语句可为用户zhangsan分配数据库userdb表userinfo的查询和插入数据权限()。

(美丽联合2016校招)

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

解析:
grant [权限] on [table] to ‘username’@‘localhost’

————2020哔哩哔哩测开笔试题< 18~ 25 >

18. 代码走查的目的是

A. 发现缺陷,遗漏和矛盾的地方
B. 确认程序逻辑与程序规格说明的一致性
C. 证明程序确实是按照用户的需求工作的
D. 验证需求变更的一致性

19. 假设身份证表中含有百万级的数据,其中身份证字段card_num上创建了唯一索引,且我们假设身份证全部由数字组成,要统计开头为100的身份证号码的数量,下面写法执行速度最慢的是

A. elect count(*) from card where card_num like ‘100%’ ’
B. select count() from card where substr(card_num,1,3) = ‘100’
C. select count(
) from card where card_num>=‘100’ and card_num < ‘100a’
D. 一样快

解析: 通配符执行速度最慢

20. 在C++中运行以下代码后,计算机变化最明显的是
#include <stdio.h>
main(){
    int i = 0;
    while(i < 10){
        printf(%d\n,i);}}

A. 虚拟内存
B. 物理内存
C. CPU占用高
D. I/O读写

21. 用6块1×2的完整瓷砖,铺满2×6的地面,一共有_种不同的铺法(不允许将瓷砖划分成小块)

A. 13
B. 15
C. 22
D. 25

解析: 全横1 全竖 1 两横 5 两竖 6

22. 下列哪个选项是Java调试器?如果编译器返回程序代码的错误,可以用它对程序进行调试

A. java.exe
B. javadoc.exe
C. jdb.exe
D. javaprof.exe

解析:
java,exe是java虚拟机
javadoc.exe用来制作java文档
jdb.exe是java的调试器
javaprof.exe是剖析工具

23. 请按规律填出下一个数组4,6,10,26,___。

正确答案: D 你的答案: B (错误)
A. 36
B. 52
C. 58
D. 74

解析:
4 * 4 - 6 = 10
6 * 6 - 10 = 26
10 * 10 - 26 = 74

24.采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为

A. n
B. n/2
C. (n-1)/2
D. (n+1)/2

25. 二分查找的时间复杂度

A. O(N*log(N))
B. O(N)
C. O(log(N))
D. O(N^2)

26. 二维数组中的查找

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

//解决思路:
//如数组样式如下:
// 1 2 3 4
// 2 3 4 5
// 3 4 5 6
//正常查找的过程,本质就是排除的过程,如果双循环查找,本质是一次排除一个,效率过低
//根据题面要求,我们可以采取从右上角(或左下角)进行比较,这样可以做到一次排除一行或者一列
//右上角是一行最大的值,一列中最小的值,从右上角开始的话,比该值小说明不在这一列,比该值大说明不在这一行

public class Solution {
    public boolean Find(int target, int [][] array) {
        int i = 0;
        int j = array[0].length - 1;
        
        while ( i < array.length && j >= 0) {
            if (target < array[i][j]) {
                j--;
            } else if (target > array[i][j]) {
                i++;
            } else {
                return true;
            }
        }
        return false;
    }
}
26. 以下程序的输出结果为
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. 编译错误

解析:
在调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用 “super(参数或无参数)” 指定调用父类构造器时,是默认调用父类的无参构造器,如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定要使用“super(参数)”指定调用父类的有参构造器,不然就会报错。并且super关键字一定要在第一行

27. 下列哪个选项是Java调试器?如果编译器返回程序代码的错误,可以用它对程序进行调试。

A. java.exe
B. javadoc.exe
C. jdb.exe
D. javaprof.exe

28. jre 判断程序是否执行结束的标准是

A. 所有的前台线程执行完毕
B. 所有的后台线程执行完毕
C. 所有的线程执行完毕
D. 和以上都无关

29. 以下代码结果是什么?
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”。

解析:
在这里插入图片描述

30.下面有关JVM内存,说法错误的是?

A. 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
B. Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
C. 方法区用于存储JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,是线程隔离的
D. 原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的

解析:
运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器
虚拟机栈区 :也就是我们常说的栈区,线程私有,存放基本类型,对象的引用和 returnAddress ,在编译期间完成分配。
堆区 : JAVA 堆,也称 GC 堆,所有线程共享,存放对象的实例和数组, JAVA 堆是垃圾收集器管理的主要区域。
方法区 : 所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的对象的回收和对类型的卸载。
**程序计数器 :**线程私有,每个线程都有自己独立的程序计数器,用来指示下一条指令的地址。
在这里插入图片描述

;