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