牛客刷题

问题:随机生成30 ~ 100之间的随机整数?

(笔试时,写下面的其中一个方法就好,类和main函数不用写,别浪费宝贵的笔试时间)

public class 随机数 {

    /**
     * 问题:随机生成30 ~ 100之间的随机整数
     */

    //法1(new Random().nextInt()用来获取0~n之间的随机整数)
    static Integer randomInt1(){
        int min = 30;
        int max = 100;
        int result = new Random().nextInt(max-min) + min;
        return result;
    }

    //法2(Math.random()用于获取0~1之间的随机数)
    static Integer randomInt2(){
        int min = 30;
        int max = 100;
        int result = (int) ((Math.random() * (max - min)) + min);
        return result;
    }

    public static void main(String[] args) {
        System.out.println(randomInt1());
        System.out.println(randomInt1());
    }

}

问题:找出1 ~ 1000内的所有质数?

嵌套两个for循环

public class 质数 {

    /**
     * 问题:找出1 ~ 1000内的所有质数?(除了1和本身,不能被其他自然数整除的数)
     */

    static void prime(){
        for(int i = 2; i <= 1000; i++){
            boolean flag = true;
            for (int j = 2; j < i; j++){
                if(i % j == 0){
                    flag = false;
                    break;
                }
            }

            if(flag){
                System.out.println(i);
            }
        }
    }

    public static void main(String[] args) {
        prime();
    }
    
}

问题:找出1 ~ 1000内的所有合数?

  • 法1:除了1和本身,能被其它自然数整除的数
  • 法2:除了1和质数,其它的自然数都是合数
public class 合数 {

    /**
     * 问题:找出1 ~ 1000内的所有合数?
     */

    //法1(除了1和本身,能被其它自然数整除的数)
    static void composite1(){
        for(int i = 2; i <= 1000; i++){
            for(int j = 2; j < i; j++){
                if(i % j ==0){
                    System.out.println(i);
                    break;
                }
            }
        }
    }

    //法2(除了1和质数,其它的自然数都是合数)
    static void composite2(){
        for(int i = 2; i <= 1000; i++){
            boolean flag = true;
            for(int j = 2; j < i; j++){
                if(i % j ==0){
                    flag = false;
                    break;
                }
            }
            if(!flag){
                System.out.println(i);
            }
        }
    }

    public static void main(String[] args) {
        composite1();
        composite2();
    }

}

这是我在java笔试中遇到的一道编程题:写一段程序,判断字符串是否是回文字符串

  • 看到这道题目我当时就蒙圈了,回文是啥意思?

  • 笔试立马就上了度娘,一看才知道,原来回文就是顺着读和逆着读都是一样的,比如:abcba

OK,知道是啥意思后就好办啦

public class 字符串回文判断 {
    
    /**
     * 问题:判断字符串是否是回文字符串
     */

    //法1:
    static boolean palindrome1(String str) {
        //通过StringBuffer将字符串反转
        return str.equals(new StringBuffer(str).reverse().toString());
    }

    //法2:
    static boolean palindrome2(String str) {
        if ((str.length() <= 1) || (str.charAt(0) == str.charAt(str.length() - 1))){
            return true;
        }
        return false;
    }

    //静态函数不能加载非静态函数
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        System.out.println(palindrome1(str));
        System.out.println(palindrome2(str));

    }

}

问题:将D:/home目录下的file.log文件复制到D:/blog目录中的debug.log(debug.log文件存在则覆盖其内容,debug.log文件不存在则先创建再写入)

如果是音频类型文件,必需要使用字节流操作(不能用字符流)。如果是文本文件,则可以使用字符流,也可使用字节流。

字节流操作:

public static void main(String[] args) {
    long begin = System.currentTimeMillis();//获取拷贝文件前的系统时间
    InputStream input = null;
    OutputStream output = null;
    try {
        input = new FileInputStream(new File("D:/home/file.log"));   //创建文件输入流对象
        output = new FileOutputStream(new File("D:/blog/debug.log")); //创建文件输出流对象
        byte[] buf = new byte[8192]; //定义一个字节数组作为缓冲区,并指定一次读取8192个字节
        int len; //记住读入缓冲区的字节长度
        while((len = input.read(buf)) != -1){  //判断文件是否读完(读完后会返回-1)
          //注意不要用output.write(buf); 不然可能导致写入的文件比原文件大,如果是图片那么可能会失真。
            output.write(buf, 0, len); //从buf缓存区中读取数据,从第一个字节开始读,读len个字节。
        }
    }catch (IOException e) {
        e.printStackTrace();
    }finally {
        //最后记得关闭IO流
        try {
            input.close(); 
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    long end = System.currentTimeMillis(); //获取文件拷贝结束时的系统时间
    System.out.println(end - begin);
}


题目描述:

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

思路:从上到下、从左到右逐个遍历二维数组的元素,和要查找的整数进行比较。

public class Solution {
    public boolean Find(int target, int[][] array) {
        boolean flag = false;
        for(int i = 0; i< array.length; i++){  //
            for(int j = 0; j<array[0].length; j++){
                if(array[i][j]==target){
                    flag = true;
                    break;
                }
            }
        }
        return flag;
    }
}

问题描述:

给定一个常规整型有序数组,如何找出某一整数是否在这个数组中,以及该整数所对应的下标。

public class 二分查找 {

    static int find(int[] array, int target){
        int i;
        for(i = 0; i < array.length; i++){
            if(array[i] == target){
                break;
            }
        }
        return i;
    }

    public static void main(String[] args) {
        int[] array = new int[1000];
        for(int i=0; i<1000; i++){
            array[i] = i;
        }
        System.out.println(find(array, 657));
    }

}

问题描述:

去除字符串两边空格!

class Solution {
    public static void main(String[] args){
        String str = " We Are Happy! ";
        System.out.println(str.trim());
    }
}

问题描述:

去除字符串所有空格!

public static void main(String[] args){
    String str = " We Are Happy! ";
    System.out.println(str.replace(" ", ""));
}

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

  1. 使用java自带函数实现
public class Solution {
    
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll(" ", "%20");
    }
    
    public static void main(){
        StringBuffer str = new StringBuffer("We Are Happy.");
        System.out.println(replaceSpace(str));
    }
}
  1. 定义一个新的StringBuffer字符串。然后遍历字符串,对每个字符进行判断。如果为空格则使用自带的append()方法向新的StringBuffer字符串中拼接“%20”,否则直接拼接该字符。
public class Solution {
    
    public String replaceSpace(StringBuffer str) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < str.length(); i++){
            char ch = str.charAt(i);
            if(ch == ' '){
                sb.append("%20");
            }else {
                sb.append(ch);
            }
        }
        return sb.toString();
    }
    
    public static void main(){
        StringBuffer str = new StringBuffer("We Are Happy.");
        System.out.println(replaceSpace(str));
    }
}

题目描述

对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。比如"Hello World"变形后就变成了"wORLD hELLO"。

import java.util.*;
public class Transform {
    
    public static String trans(String s, int n){
        String result = "";
        String temp = "";
        for(int i = 0; i < n; i++){
            char ch = s.charAt(i);
            if(ch >= 'a' && ch <= 'z'){ //字母是否为小写
                temp += Character.toUpperCase(ch);  //将小写转化为大写
            }else if(ch >= 'A' && ch <= 'Z'){ //字母是否为大写
                temp += Character.toLowerCase(ch); //将大写转化为小写
            }else{
                temp = ch + temp; //遇到空格,就将空格添加到前面
                result = temp + result;
                temp = "";
            }
        }
        result = temp + result;
        return result;
    }

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String s = sc.nextLine();
            int n = sc.nextInt();
            System.out.println(trans(s, n));
        }
    }
    
}

题目描述

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

解析:使用String的replaceAll(String regex, String target)进行替换

import java.util.Scanner;
public class Main {
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        String regex = "["+ s2 +"]";
        System.out.println(s1.replaceAll(regex,""));
    }
    
}

import java.util.Scanner;
public class Main {
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){ 
            String s1 = sc.nextLine();
            String s2 = sc.nextLine();
            String regex = "["+ s2 +"]";
            System.out.println(s1.replaceAll(regex,""));
        }
    }
    
}

24365

解析:先遍历字符串2,截取字符串2的每个字符,然后将字符串1中相同的字符全都移除(替换成空字符串)

import java.util.Scanner;
public class Main {
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        for(int i=0; i < s2.length(); i++){
            s1 = s1.replaceAll(s2.substring(i,i+1),"");
        }
        System.out.println(s1);
    }
    
}

题目描述

在英文中,我们会把一些长的名字或者短语进行缩写。例如"looks good to me"缩写为"lgtm",短语中的每个单词的首字母组成缩写。现在给出一个字符串s,字符串s中包括一个或者多个单词,单词之间以空格分割,请输出这个字符串的缩写。

class Solution{
    
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in); //开启控制台输入
        String str = input.nextLine(); //获取控制台输入的字符串
        
        if(str != null && !"".equals(str)){
            String[] array = str.split(" "); //根据空格截取字符串
            for(String word : array){
                System.out.print(word.charAt(0)); //不换行打印单词首字母
            }
        }
    }
    
}

问题描述:

jdk和jre的区别?

参考答案:

  • jdk:Java Development Kit(java开发工具包),是程序员使用java语言编写java程序所需的开发工具包。jdk包含了jre、编译java源码的编译器javac(Java Compiler)以及一些调试器等。(如果需要运行程序,只需要安装jre即可;但如果想要编写程序,那么就需要安装jdk)

  • jre:Java Runtime Environment(java运行时环境),是java程序运行所需的软件环境,jre包含了jvm、java基础类库。

  • jvm:Java Virtual Machine(Java虚拟机),jvm包含了解释器javai(Java Interpreter)、类加载器ClassLoader、垃圾回收器JVM GC、内存管理等。

牛客刷题_第1张图片


谈谈你对类和对象的理解?

类是对象的抽象,对象是类的具体实现。举个例子:老师就可以比作类,而xxx老师则是这个类的对象。


1.问题:简述读写IO流概念:

**在程序中所有的数据都是以流的方式进行传输和保存的。**程序需要数据的时候就需要通过输入流读取数据;程序需要保存一些数据的时候就需要通过输出流完成。


2.问题:IO流类型划分:

读写IO流类型划分:

  • 按功能可划分为输入流和输出流:输入流是指将程序外部的文件输入到文件中的流;输出流是指将程序产生的文件进行输出。
  • 按内容可划分为字节流和字符流:字节流通常是指我们所说的二进制文件;字符流则是指我们可以阅读的字符。
输入流 输出流
字节流 InputStream
FileInputStream
BufferedInputStream
OutputStream
FileOutputStream
BufferedOutputStream
字符流 Reader
FileReader
InputStreamReader
BufferedReader
Writer
FileWriter
OutputStreamWriter
BufferedWriter

字节流和字符流的主要区别是什么呢

  • 字节流在操作时不会用到缓存(内容),是直接对文件本身进行操作。字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
  • 在硬盘上的所有文件都是以字节形式存在的(图片、声音、视频),而字符值在内存中才会形成;

注意:

  • 针对第一点,如果一个程序频繁对一个资源进行IO操作,效率会非常低。那么此时,通过缓存区,先把需要操作的数据暂时放入内存(缓存)中,以后就可以直接从内存中读取数据,避免多次的IO操作,进而提高效率。
  • 真正存储和传输数据时,都是以字节为单位的;字符只是存在于内存当中。所以,字节流的适用范围更广。

所以呢:

  • 字符流使用场景:读写文本数据(字符数据)的时候,使用字符流。
  • 字节流使用场景:读写音频等不需要转化成字符的数据时,使用字节流。

3.问题:FileInputStream和BufferInputStream的区别?

  • FileInputStream是字节流。BufferedInputStream是字节缓冲流。
  • 使用BufferedInputStream读取资源的效率比FileInputStream读取资源高(BufferedInputStream内部封装了一个长度为8192的字节数组,使用BufferedInputStream的read方法会读取尽可能多的字节),并且FileInputStream的read方法会出现阻塞现象。

4.问题:FileInputStream和FileReader的区别?

  • FileInputStream是字节输入流,FileReader是字符流

5.问题:InputStream和FileInputtStream?

  • InputStream是一个抽象类,不能实例化。所以在读取文件时,需要通过InputStream的子类FileInputStream来完成。
  • InputStream input = new FileInputStream();

6.问题:new FileInputStream(“D:/file.txt”); 和 new FileInputStream(new File(“D:/file.txt”));的区别?

构造函数内部封装不同罢了。new FileInputStream("D:/file.txt");最后也是会被转化成new FileInputStream(new File("D:/file.txt"));的。


7.问题:字节流慨念?

字节流也就是俗称的二进制流,字节流在读取数据时,数据是以字节为单位进行读写操作的。也就是一个字节一个字节的读取。


8.问题:什么是字节缓冲流?为什么使用使用字节流?

  • 举个例子:以搬砖为例,一个砖相当于一个字节。有一天,砖厂老板王胖子叫工人老李将所有的砖都搬到天堂。老板王胖子是个铁公鸡,并没有给厂房购买运输车,所以工人老李只能一次般一个砖在砖厂和天堂两边来回跑,半年下来砖厂的砖头终于全部都搬到了天堂。但砖厂也因为工人老李的超高工作效率而倒闭了。没办法,工人老李只能换了一个工厂工作,新的工厂不一样咯,大大小小什么型号的运输车都有。这天老板又叫老李运砖了,于是老李选了辆能装1024个砖的运输车来运输,这下子效率高咯,只用了2天就完成了运输任务。
  • 缓冲区是jvm在内存中开辟的一块内存空间。我们可以将数据存入缓冲区中,我们可以先将字节读进缓冲区(一个字节一个字节的读,读取xxx个字节),缓冲区满后就写入文件中。

首先,了解下什么是缓冲区:
电脑内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈——就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆——就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区——就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区——全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)
电脑缓冲区就是预留下来的做为急用的那一部分,为暂时置放输出或输入资料的内存。
如何对缓冲区进行操作:
当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader, 它是字节转换为字符的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。使用FileReader读取文件:

你可能感兴趣的:(面试题)