每日一题 错选择 及 编程题 周总结

Posted 满眼*星辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 错选择 及 编程题 周总结相关的知识,希望对你有一定的参考价值。

Week3

Day1

选择题

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

正确答案: C

方法区是线程共享的,C错


以下程序的输出结果是
public class Print{
static boolean out(char c){
System.out.println©;
return true;
}
public static void main(String[] argv){
int i = 0;
for(out(‘A’);out(‘B’) && (i<2);out(‘C’)){
i++;
out(‘D’);
}
}
A ABDCBDCB
B BCDABCD
C 编译错误
D 运行错误

正确答案: A
这里调用函数后都会有boolean返回值,不会发生编译错误
再就是考察for循环的过程


下面关于程序编译说法正确的是()
A java语言是编译型语言,会把java程序编译成二进制机器指令直接运行
B java编译出来的目标文件与具体操作系统有关
C java在运行时才进行翻译指令
D java编译出来的目标文件,可以运行在任意jvm上

正确答案: C

A:.java编译成的是字节码,再被各系统的jvm翻译成本系统可以识别的机器码,这就是java一次编程多平台应用的跨平台性
B:java源文件生成的是class文件,与系统无关
C:注意字节码和机器码不是一回事 java程序在运行时字节码才会被jvm翻译成机 器码,所以说java是解释性语言
D:注意jvm的版本,好比人穿裤子,一条裤子能被任何人穿上吗


参数解析

在这里插入图片描述

方法一:分割字符串

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        int l = 0;
        int r = 0;
        boolean symbol = false;
        List<String> list = new ArrayList<>();
        char[] arr = s.toCharArray();
        while (r < arr.length) {if(arr[r] == '/') {
            symbol = true;
            StringBuilder str = new StringBuilder();
            while (l < r) {
                str.append(arr[l]);
                l++;
            }
            if(!str.toString().trim().equals("")) {
                list.add(str.toString().trim());
            }
        }
            if(arr[r] == ':') {
                symbol = true;
                StringBuilder str = new StringBuilder();
                while (l < r-1) {
                    str.append(arr[l]);
                    l++;
                }
                if(!str.toString().trim().equals("")) {
                    list.add(str.toString().trim());
                }
            }
            if(arr[r] == '\\"') {
                symbol = true;
                StringBuilder str = new StringBuilder();
                while (l < r) {
                    str.append(arr[l]);
                    l++;
                }
                l++;
                if(!str.toString().trim().equals("")) {
                    list.add(str.toString().trim());
                }
            }
            r++;
        }
        StringBuilder str = new StringBuilder();
        while (l < r) {
            str.append(arr[l]);
            l++;
        }
        if(!str.toString().trim().equals("")) {
            list.add(str.toString().trim());
        }
        if(symbol) {
            System.out.println(list.size());
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
        }else {
            String[] res = s.trim().split(" ");
            System.out.println(res.length);
            for(int i = 0; i < res.length; i++) {
                System.out.println(res[i]);
            }
        }
    }
}

方法二:条件顺序打印

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            if(str.charAt(i) == '"') {
                do {
                    i++;
                }while (str.charAt(i) != '"');
            }
            if (str.charAt(i) == ' ') {
                count++;
            }
        }
        System.out.println(count+1);
        int font = 1;
        for (int i = 0; i < str.length(); i++) {
            if(str.charAt(i) == '"') {
                font = font^1;
            }
            if(str.charAt(i) != '"' && str.charAt(i) != ' ') {
                System.out.print(str.charAt(i));
            }
            if(font == 1 && str.charAt(i) == ' ') {
                System.out.println();
            }
            if(font == 0 && str.charAt(i) == ' ') {
                System.out.print(' ');
            }
        }
    }
}

跳石板

在这里插入图片描述
方法一:动态规划

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[] arr = new int[m+1];
        //初始化n-m的数据为最大值
        for (int i = n; i < arr.length; i++) {
            arr[i] = Integer.MAX_VALUE;
        }
        arr[n] = 0; //初始状态
        for (int i = n; i < m; i++) {
            //如果没有到达过这个位置,则下一轮循环
            if (arr[i] == Integer.MAX_VALUE) {
                continue;
            }
            //list来记录当前石板能跳的所有距离
            List<Integer> list = piv(i);
            //遍历当前石板所有能跳的距离
            for (int j : list) {
                //大前提,跳到的石板下标不能超过m,否则数组越界
                if(i+j <= m) {
                    //如果跳到的石板之前没有跳到过,则直接+1
                    if(arr[i] == Integer.MAX_VALUE) {
                        arr[i+j] = arr[i] + 1;
                    }else { //否则就取跳到石板步数最小值
                        arr[i+j] = Math.min(arr[i+j],arr[i]+1);
                    }
                }
            }
        }
        //最后判断下标为m的石板的最小步数
        if(arr[m] == Integer.MAX_VALUE) {
            System.out.println(-1);
        }else {
            System.out.println(arr[m]);
        }
    }

    //用来记录石板下标的所有约数
    public static List<Integer> piv(int num) {
        List<Integer> list = new ArrayList<>();
        //这里只需要遍历到i*i <= num即可,因为两数相乘才得到num,小的乘数找到了,对应的大的乘数则为num/i
        for (int i = 2; i*i <= num; i++) {
            if(num % i == 0) {
                list.add(i);
                //这里有可能有i == num/i 的情况,所以只取一次i
                if(i != num/i) {
                    list.add(num/i);
                }
            }
        }
        return list;
    }
}

方法二:广度优先遍历

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        Queue<Integer> queue = new LinkedList<>();
        Map<Integer,Integer> map = new HashMap<>();
        map.put(n,0);
        queue.add(n);
        while (!queue.isEmpty()) {
            int head = queue.poll();
            if(head == m) {
                System.out.println(map.get(head));
                return;
            }
            List<Integer> list = yueNum(head);
            for(int i = 0; i < list.size(); i++) {
                int sum = head + list.get(i);
                if(!map.containsKey(sum) && sum <= m) {
                    queue.add(sum);
                    map.put(sum,map.get(head)+1);
                }
            }
        }
        System.out.println(-1);
    }
    public static ArrayList<Integer> yueNum(int n) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                list.add(i);
                if (n / i != i) {
                    list.add(n / i);
                }
            }
        }
        return list;
    }
}

Day2

选择题

____技术是一种可以使音频,视频和其他多媒体信息在 Internet 及 Intranet 上以实时的,无需下载等待的方式进行播放的技术。
A 流媒体
B 多媒体
C 复合媒体
D 音视媒体

正确答案:A
流媒体技术是一种可以使音频,视频和其他多媒体信息在 Internet 及 Intranet 上以实时的,无需下载等待的方式进行播放的技术。


下列语句正确的是:
A 形式参数可被字段修饰符修饰
B 形式参数不可以是对象
C 形式参数为方法被调用时真正被传递的参数
D 形式参数可被视为local variable

正确答案:D
A:形式参数只能被final修饰
B:形式参数可以是对象
C:形式参数被调用时被传递的是实际参数的拷贝
D:local variable:局部变量


给定代码:

public class SwitchTest{//1
	public static void main(String[] args) {//2
	System.out.println("value="+switchit(4));//3
}//4
public static int switchit(int x) {
	int j=1;
	switch (x) {
		case 1:j++;
		case 2:j++;
		case 3:j++;
		case 4:j++;
		case 5:j++;
		default:j++;
	}
	return j+x;
}

第三行将输出什么?
A value=6
B value=8
C value=3
D value=5
E value=4

正确答案:B
不加break的话,switch会从第一次进入case语句的地方,一直向下执行完。


计算日期到天数转换

在这里插入图片描述

import java.util.*;
public class Main{
    public static int iConverDateToDay(int year,int month,int day) {
        int[] monthDay = {31,28,31,30,31,30,31,31,30,31,30,31};
        int sum = 0;
        if(year < 0 || month < 0 || month > 12) {
            return -1;
        }
        if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            monthDay[1] = 29;
        }
        if(day > monthDay[month-1]) {
            return -1;
        }
        for(int i = 0; i < month-1; i++) {
            sum += monthDay[i];
        }
        sum += day;
   

以上是关于每日一题 错选择 及 编程题 周总结的主要内容,如果未能解决你的问题,请参考以下文章

每日一题 错选择 及 编程题 周总结

寒假每日一题总结(第七天)

寒假每日一题总结(第十五天)

每日一题谈谈你对函数式编程的理解?

数组编程题(github每日一题)

每日一题介绍Spark核心组件及功能?