Java训练题8

一、选择题

1、关于java中的数组,下面的一些描述,哪些描述是准确的(A C )
A: 数组是一个对象,不同类型的数组具有不同的类
B: 数组长度是可以动态调整的
C: 数组是一个连续的存储结构
D: 一个固定长度的数组可类似这样定义:int array[100]
答案解析:A C
数组的长度在一开始是定义好的,不可以动态调整;D项中数组不能这样定义;
2、若声明一个浮点数数组如下: float average[]=new float[30];假设该数组的内存起始位置为200, average[15]
的内存地址是(C )

A: 214
B: 215
C: 260
D: 256
答案解析:C
一个浮点类型占4个字节,如果其实位置是200,average[15]是数组中第16个元素,故地址为200+15*4
3、下列哪个类的声明是正确的(D )
A: abstract final class HI{}
B: abstract private move{}
C: protected private number{}
D: public abstract class Car{}
答案解析:D
B C中没有class关键字,A中abstract final不能一起修饰一个类
4、与算法的时间复杂度有关的是(A )
A. 问题规模
B. 计算机硬件性能
C. 编译程序质量
D. 程序设计语言
答案解析:A
比如一个算法的时间复杂度为O(n),n是问题的规模;
n越大,算法执行所需要的时间就越多

5、某算法的时间复杂度为O(n^2),表明该算法的(C )
A. 问题规模是n^2
B. 执行时间等于n^2
C. 执行时间与n^2成正比
D. 问题规模与n^2成正比
答案解析:C
算法的时间复杂度中n只是问题的规模,不代表具体的执行时间,具体的执行时间和CPU执行的时间有关

二、编程题

1、拼写单词
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。返回词汇表words 中你掌握
的所有单词的长度之和。OJ链接【力扣-1160号问题】

示例1:
输入:words = ["cat","bt","hat","tree"], chars = "atach"
输出:6
解释:
可以形成字符串 "cat""hat",所以答案是 3 + 3 = 6。
示例2:
输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
输出:10
解释:
可以形成字符串 "hello""world",所以答案是 5 + 5 = 10

【解题思路】:
这是一类经典的题型。凡是和“变位词”、“字母顺序打乱”相关的题目,都考虑统计字母出现的次数。这种方法我叫做“counter 方法”。我们既统计“字母表”中字母出现的次数,也统计单词中字母出现的次数。如果单词中每种字母出现的次数都小于等于字母表中字母出现的次数,那么这个单词就可以由字母表拼出来。
如何实现计数结构呢?我们注意到题目有一个额外的条件:所有字符串中都仅包含小写英文字母。这意味着我们可以用一个长度为 26 的数组来进行计数。这也是很多字符串计数问题的常用技巧。

class Solution {
    public int countCharacters(String[] words, String chars) {
        int[] chars_count=count(chars);// 统计字母表的字母出现次数
        int res=0;
        for(String word:words){
            int[] word_count=count(word);// 统计单词的字母出现次数
            if(contains(chars_count,word_count)){
                res+=word.length();
            }
        }
        return res;
    }
     // 检查字母表的字母出现次数是否覆盖单词的字母出现次数
    boolean contains(int[] chars_count,int[] word_count){
        for(int i=0;i<26;i++){
            if(chars_count[i]<word_count[i]){
                return false;
            }
        }
        return true;
    }
    // 统计 26 个字母出现的次数
    int[] count(String word){
        int[] counter=new int[26];
        for(int i=0;i<word.length();i++){
            char c=word.charAt(i);
            counter[c-'a']++;
        }
        return counter;
    }
}

2、一年中的第几天
给你一个按 YYYY-MM-DD 格式表示日期的字符串 date,请你计算并返回该日期是当年的第几天。通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 2 天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。OJ链接【力扣-1160号问题】

示例1:
输入:date = "2019-01-09"
输出:9
示例2:
输入:date = "2019-02-10"
输出:41

这个问题考察两点:1.闰年的判定 2.使用subString根据字符串的特点拆分出年月日。

class Solution {
    public int dayOfYear(String date) {
        int year=Integer.parseInt(date.substring(0,4));
        int month = Integer.parseInt(date.substring(5,7)); 
        int day = Integer.parseInt(date.substring(8)); 
        int[] monthArray = {31,28,31,30,31,30,31,31,30,31,30,31}; 
        if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { 
            monthArray[1] = 29; 
        } 
        int sum = 0; 
        for (int i = 0; i < month - 1; i++) { 
            sum += monthArray[i]; 
        } 
        sum += day; 
        return sum; 
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 编写一个 Java 程序,在控制台输出“Hello World!” ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } } ``` 2. 编写一个 Java 程序,求一个整数数组中的最大值和最小值 ```java public class MaxMin { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; int max = arr[0]; int min = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } if (arr[i] < min) { min = arr[i]; } } System.out.println("最大值:" + max); System.out.println("最小值:" + min); } } ``` 3. 编写一个 Java 程序,计算从 1 到 100 的所有整数的和 ```java public class Sum { public static void main(String[] args) { int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; } System.out.println("总和:" + sum); } } ``` 4. 编写一个 Java 程序,判断一个整数是否为质数 ```java public class PrimeNumber { public static void main(String[] args) { int num = 7; boolean isPrime = true; for (int i = 2; i < num; i++) { if (num % i == 0) { isPrime = false; break; } } if (isPrime) { System.out.println(num + "是质数"); } else { System.out.println(num + "不是质数"); } } } ``` 5. 编写一个 Java 程序,判断一个字符串是否为回文字符串 ```java public class Palindrome { public static void main(String[] args) { String str = "level"; boolean isPalindrome = true; for (int i = 0; i < str.length() / 2; i++) { if (str.charAt(i) != str.charAt(str.length() - 1 - i)) { isPalindrome = false; break; } } if (isPalindrome) { System.out.println(str + "是回文字符串"); } else { System.out.println(str + "不是回文字符串"); } } } ``` 6. 编写一个 Java 程序,将一个字符串中的所有空格替换为“%20” ```java public class ReplaceSpace { public static void main(String[] args) { String str = "Hello World"; String newStr = str.replaceAll(" ", "%20"); System.out.println(newStr); } } ``` 7. 编写一个 Java 程序,将一个字符串反转 ```java public class ReverseString { public static void main(String[] args) { String str = "abcdefg"; StringBuilder sb = new StringBuilder(str); sb.reverse(); System.out.println(sb.toString()); } } ``` 8. 编写一个 Java 程序,将一个数组中的元素顺序颠倒 ```java public class ReverseArray { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; int[] newArr = new int[arr.length]; for (int i = 0; i < arr.length; i++) { newArr[arr.length - 1 - i] = arr[i]; } System.out.println(Arrays.toString(newArr)); } } ``` 9. 编写一个 Java 程序,输出九九乘法表 ```java public class MultiplicationTable { public static void main(String[] args) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(j + "×" + i + "=" + j * i + "\t"); } System.out.println(); } } } ``` 10. 编写一个 Java 程序,求斐波那契数列中的第 n 项 ```java public class Fibonacci { public static void main(String[] args) { int n = 7; int[] arr = new int[n]; arr[0] = 1; arr[1] = 1; for (int i = 2; i < arr.length; i++) { arr[i] = arr[i - 1] + arr[i - 2]; } System.out.println("第" + n + "项:" + arr[n - 1]); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值