Java面向对象编程(22)

简介: Java面向对象编程(22)

若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。

A. 顺序表

B. 双链表

C. 带头结点的双循环链表

D. 单循环链表

答案:A

下列数据结构具有记忆功能的是?

A. 队列

B. 循环队列

C. 栈

D. 顺序表

答案:C

循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初 始时为空,下列判断队空和队满的条件中,正确的是()

A. 队空:end1==end2;队满:end1==(end2+1) mod M

B. 队空:end1==end2;队满:end2==(end1+1) mod (M-1)

C. 队空:end2==(end1+1) mod M;队满:end1==(end2+1) mod M

D. 队空:end1==(end2+1) mod M;队满:end2==(end1+1) mod (M-1)

答案:A

对递归程序的优化的一般的手段为()

A. 尾递归优化

B. 循环优化

C. 堆栈优化

D. 停止值优化

答案:A

将一颗有 100 个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根节点编号为 1 ,则编号为 98 的节点的父节点编号为()

A. 47

B. 48

C. 49

D. 50

答案:C

将一棵二叉树的根结点放入队列,然后递归的执行如下操作,将出队结点所有子结点加入队。以上操作可以实现哪种遍历()

A. 前序遍历

B. 中序遍历

C. 后序遍历

D. 层序遍历

答案:D

有 1000 个无序的整数,希望使用最快的方式找出前 50 个最大的,最佳的选择是( )

A. 冒泡排序

B. 基数排序

C. 堆排序

D. 快速排序

答案:C

下列说法中错误的是()

A. 红黑树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)

B. B+树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)

C. Hash表插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(n)

D. 排序链表插入操作的平均时间复杂度为O(n),最坏时间复杂度为O(n)

答案:C

将两个各有n个元素的有序表归并成一个有序表,最少的比较次数是()

A. 2n

B. 2n-1

C. n-1

D. n

答案:D

下列排序法中,每经过一次元素的交换会产生新的逆序的是( )

A. 快速排序

B. 冒泡排序

C. 简单插入排序

D. 简单选择排序

答案:A

小易的升级之路

题目描述:小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为 b1,b2,b3...bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但 他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?

输入描述:对于每组数据,第一行是两个整数n(1≤n<100000) 表示怪物的数量和a表示小易的初始能力值. 然后输入n行,每行整数,b1,b2...bn(1≤bi≤n)表示每个怪物的防御 力

输出描述:对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值


public class Main35 {
//小易的升级之路
    public static int gcb(int a,int b){
        int c;
        while ((c= a % b) !=0){
            a=b;
            b=c;
        }
        return b;
    }
    public static void main(String[] args) throws Exception {
        //循环读入
        String line;
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        while ((line =reader.readLine()) !=null){
            String[] arr=line.split(" ");
            int num=Integer.parseInt(arr[0]);
            int c=Integer.parseInt(arr[1]);
            //读入boss的防御值
            for (int i = 0; i < num; ++i) {
                int power=Integer.parseInt(reader.readLine());
                if (c>=power){
                    c+=power;
                }else {
                    c+=gcb(c,power);
                }
            }
            System.out.println(c);
        }
    }
}

找出字符串第一个只出现一次的字符

题目描述:找出字符串中第一个只出现一次的字符

数据范围:输入的字符串长度满足 1<=n<=1000

输入描述:输入一个非空字符串

输出描述:输出第一个只出现一次的字符,如果不存在输出-1

方法1


public class Main36 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String str=scanner.nextLine();
        int[] arr=new int[255];
        //数组的初始情况全部为0
        for (int i = 0; i < str.length(); i++) {
            char ch=str.charAt(i);
            arr[ch]++;
        }
        int flag=1;
        char ch=' ';
        for (int i = 0; i < str.length(); i++) {
            ch=str.charAt(i);
            if (arr[ch]==1){
                flag=0;
                break;
            }
        }
        if (flag==0){
            System.out.println(ch);
        }else{
            System.out.println(-1);
        }
    }
}

方法2


public class Main37 {
    //找出字符串第一个只出现一次的字符
    public static void findFirstChar(String str){
        char[]arr=str.toCharArray();
        //计数数组
        int[] count=new int[128];
        //遍历字符,统计次数
        for (int i = 0; i < arr.length; ++i) {
            count[arr[i]]++;
        }
        //找到第一次只出现一次的字符
        boolean ret=false;
        for (int i = 0; i < arr.length; ++i) {
            if (count[arr[i]] ==1){
                System.out.println(arr[i]);
                ret=true;
                break;
            }
        }
        if ( !ret){
            System.out.println(-1);
        }
    }
    public static void main(String[] args) throws Exception{
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        String str;
        while ((str=reader.readLine()) !=null){
            findFirstChar(str);
        }
    }
}
相关文章
|
3月前
|
Java 开发者
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
在Java面向对象编程的广阔海洋中,多态犹如一股深邃的潜流,它推动着代码从单一走向多元,从僵化迈向灵活。
42 7
|
3月前
|
Java 开发者
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
那些年,我们一同踏入Java编程的大门,多态,这个充满魔法的名字,曾无数次点亮我们探索面向对象编程的热情。
49 5
|
3月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
5月前
|
Java
Java面向对象编程新篇章:多态,你准备好了吗?
【6月更文挑战第17天】Java的多态性是面向对象编程的核心,它允许通过统一的接口处理不同类型的对象。例如,在一个虚拟宠物游戏中,抽象类`Pet`定义了`speak()`方法,猫、狗和鹦鹉等子类各自重写此方法以实现独特叫声。在`main`方法中,使用`Pet`类型的引用创建子类对象并调用`speak()`,多态机制确保调用实际对象的方法,实现代码的灵活性和可扩展性。通过多态,我们能以更低的耦合度和更高的复用性编写更优雅的代码。
38 3
|
5月前
|
Java
Java 面向对象编程:父类与子类的“传承”与“创新”之路
【6月更文挑战第16天】Java 中的父类与子类展示了面向对象的“传承”与“创新”。子类`Dog`继承`Animal`,获取其属性和方法如`name`和`makeSound`。子类通过`@Override`增强`makeSound`,显示多态性。设计父类时应考虑普遍性,子类创新专注自身特性,遵循继承最佳实践,利用复用提升效率,构建可维护的软件系统。
153 57
|
3月前
|
存储 前端开发 JavaScript
【前端学java】面向对象编程基础-类的使用(4)
【8月更文挑战第9天】面向对象编程基础-类的使用
21 0
【前端学java】面向对象编程基础-类的使用(4)
|
3月前
|
Java 程序员 开发者
Java的面向对象编程:从基础到深入
【8月更文挑战第21天】在本文中,我们将探讨Java的面向对象编程(OOP)的核心概念,包括类、对象、继承、多态和封装。我们将通过实例和比喻,以通俗易懂的方式,深入理解这些概念的内涵和意义,以及它们如何影响我们的编程思维和实践。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更深入地理解Java的OOP,并启发你思考如何在你的项目中应用这些概念。
|
5月前
|
Java 安全 索引
滚雪球学Java(48):面向对象编程中的StringBuffer类详解
【6月更文挑战第2天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
65 5
滚雪球学Java(48):面向对象编程中的StringBuffer类详解
|
4月前
|
Java API 项目管理
Java中的函数式编程与传统面向对象编程对比
Java中的函数式编程与传统面向对象编程对比
|
5月前
|
存储 安全 Java
深入探讨 Java 封装机制:为何它是面向对象编程的核心?
【6月更文挑战第16天】Java的封装是OOP核心,它将数据和操作数据的方法打包在类中,隐藏实现细节并提供公共接口。例如,`Student`类封装了私有属性`name`和`age`,通过`get/set`方法安全访问。封装提升代码稳定性、可维护性和复用性,防止外部直接修改导致的错误,确保数据安全。它是面向对象编程优于传统编程的关键,促进高效、可靠的开发。
62 7
下一篇
无影云桌面