1.算法练习题(第一章概论)
-
有一个含n(n>2)个整数的数组a,判断其中是否存在出现次数超过所有元素一半的元素.
/** * 有一个含n(n>2)个整数的数组a,判断其中是否存在出现次数超过所有元素一半的元素. * @author ASUS * */ public class Test7 { public static void realize(int a[],int n) { System.out.println("-------------------------------------------------------------------------"); int b = -1; //存放满足条件的元素 //将每一个元素分别和所有元素相比较,得出重复次数 int i = 0 ; //初始化i while(i < n) { int k = 0; int num = 0; //记录某个元素出现的次数 while(k < n) { //System.out.println("测试k="+k); if(a[i] == a[k]) num++; if((k == n - 1) && (num > (n/2 + n%2))) { b = a[i]; break; //已经有一个元素满足条件,后面不可能还存在一个元素有大于一半的可能性,跳出循环 } k++; } if(b != -1) { break; //跳出循环 } i++; } //输出结果 if(b == -1) System.out.println("不存在这个数"); else System.out.println("存在,这个数为:"+b); System.out.println("-------------------------------------------------------------------------"); } public static void main(String[] args) { int a[] = new int[100]; int n = 21; //给目标数组a赋值 for(int i = 0 ; i < n; i++) { if((i < 6) || (i > 14)) a[i] = 31; else { a[i] = i*2; } } Test7.realize(a, n); } }
-
一个字符串采用String对象存储,设计一个算法判断该字符是否是回文[^回文:例如abccba这种形式,第n个和倒数第n个字符相同]
/** * 一个字符串采用String对象存储,设计一个算法判断该字符是否是回文 * @author ASUS * */ public class Test8 { /** * 这里使用java中的charAt()方法, * 与c++中字符串本质为数组的处理方式相似 */ public static void realize(String str) { //第n个字符和第n-1个字符相比较 for(int i=0,j=str.length()-1;i <= j ;i++,j--) { if(str.charAt(i) != str.charAt(j)) { System.out.println(str+" : 不是回文"); return; } } System.out.println(str+" : 是回文"); } public static void main(String[] args) { Test8.realize("abcddcba"); } }
-
有一个整数序列,设计一个算法判断其中是否存在两个元素的和恰好等于给定的整数k.
/** * 有一个整数序列,设计一个算法判断其中是否存在两个元素的和恰好等于给定的整数k. * @author ASUS * */ public class Test9 { /** * 如果有多个符合的元素,只找其中的一组符合的元素 * @param a 给定序列 * @param n 给定序列的长度 * @param k 给定数值 */ public static void realize(int a[],int n,int k) { int flag = -1; //标记 int i = 0 ; int j = 0; while(i < n) { j = 0; while(j < n) { if(a[i] + a[j] == k) { flag = 1; break; } j++; } if(flag == 1) { break; } i++; } if(flag == -1) { System.out.println("不存在这样的两个数使其等于"+k); }else { System.out.println("存在"+a[i]+"+"+a[j]+"="+k); } } public static void main(String[] args) { int a[] = {1,2,3,4,5,6,7,8,9}; Test9.realize(a, 9, 16); } }
-
编写一个实验程序,随机产生10个1~20的整数,设计一个搞笑算法找其中的最大元素和最小元素,并统计元素之间的比较次数。调用该算法执行10次并求元素的平均比较次数.
/** * 编写一个实验程序,随机产生10个1~20的整数, * 设计一个搞笑算法找其中的最大元素和最小元素, * 并统计元素之间的比较次数。调用该算法执行10次并求元素的平均比较次数 * @author dmt * */ public class Test1 { //产生随机数组a public static void randa(int a[],int n) { for(int i = 0 ; i < n ; i++) { a[i] = (int)(Math.random()*20) + 1; } } //求最大最下值,和平均比较次数 public static int realize(int a[],int n) { //flag为比较次数,max和min分别为最大最小值 int flag = 0,max = a[0],min = a[0]; int i = 1; //求最大最小具体的实现循环 while(i < n) { flag++;//比较次数增加一次 if(a[i] > max) { max = a[i]; }else { flag++;//比较次数再增加一次 if(min > a[i]) min = a[i]; } i++; } for(i = 0 ; i < n ; i++) { System.out.print(" "+a[i]+ ","); } System.out.println("最大值:"+max+",最小值:"+min+",比较次数:"+flag); return flag; } //测试 public static void main(String[] args) { int a[] = new int[10]; int n= 10; int flag = 0,count = 0,average = 0; //执行10次,并求次出平均比较次数 for(int i = 1 ; i <= 10;i++) { System.out.println(""); Test1.randa(a,n);//产生随机数组 average = average + Test1.realize(a, n); } System.out.println("平均比较次数:"+average/10); } }
-
编写一个实验程序,利用priority_queue(优先队列)求出一个无序整数序列中第k个最小的元素.
优先队列:blog
import java.util.PriorityQueue; /** * 利用priority_queue(优先队列)求出一个无序整数序列中第k小的元素 * 关于java中priorityQueue类: * https://www.cnblogs.com/CarpenterLee/p/5488070.html * @author dmt * */ public class Test1_5_2 { //第k小的元素,就是小根堆出队的k个元素 public static int thk(int a[],int n,int k) { int e = -1;//默认为-1 PriorityQueue<Integer> pq = new PriorityQueue<>(); //将元素放入优先队列中。 for(int i = 0; i < n ; i++) { pq.add(a[i]); } //一直取出元素,直到取出第k个元素,并记录 for(int i = 0 ; i < k ;i++) { e = pq.remove();//取出并删除首元素 } return e; } public static void main(String[] args) { int a[] = {73,32,69,90,23,57,31,66,92,52}; System.out.println("实验结果:"); for(int k = 1; k <= a.length; k++) { System.out.println("第"+k+"小的元素:"+Test1_5_2.thk, a.length, k)); } } }
-
编写一个实验程序,对于一个含n(n>1)个元素的
queue<int>
队列容器qu,出队从队头到队尾的k(1<=k<=n)个元素,其他队列元素不变.import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; import java.util.Queue; /** * 编写一个实验程序,对于一个含n(n>1)个元素的`queue<int>`队列容器qu, * 出队从队头到队尾的k(1<=k<=n)个元素,其他队列元素不变. * @author ASUS * */ public class Test3 { public int number = -1; public Queue<Integer> queue= null; public static Test3 realize(Queue<Integer> queue,int k) { Queue<Integer> record = new LinkedList<Integer>(); int number = -1; //默认为-1 int flag = 0; //将queue目标队列中出队的元素,全部保存在临时记录队列record,当出队元素为第k个元素时,不进行记录到临时队列中,而是保存在mumber中 for(int num:queue) { flag++; if(flag != k) record.offer(num); else number = num; } Test3 test3 = new Test3(); test3.number = number; test3.queue = record; return test3; } public static void main(String[] args) { System.out.println("实验结果:"); Test3 test3 = new Test3(); //建立一个栈,并初始化 Queue<Integer> queue = new LinkedList<Integer>(); queue.offer(23); queue.offer(32); queue.offer(89); queue.offer(12); queue.offer(34); queue.offer(88); //遍历前的目标队列: System.out.print("遍历前的目标队列:"); for(int num : queue) { System.out.print(" "+num +","); } test3 = Test3.realize(queue, 3); System.out.print("\n遍历后的目标队列:"); //遍历后的目标队列: for(int num : test3.queue) { System.out.print(" "+num +","); } //移除的第k个元素值为: System.out.println("\n移除的第k个元素值为:"+ test3.number); } }
-
编写一个实验程序,设计一种好的数据结构尽可能高效的实现元素的插入(元素)、删除(按值或者按下标)、按值查找(元素下标)和按序号查找(元素)(假设所有元素值都不相同).
/** * 编写一个实验程序,设计一种好的数据结构尽可能高效的实现 * 元素的插入、删除、按值查找和按序号查找(假设所有元素值都不相同). * @author ASUS * */ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; //设计的高效数据结构MyData 假设保存元素为字符串 class MyData{ private List<String> list = null; //用于list集合存放元素 private Map<String,Integer> map = null; //用map存放元素的下标 //空构造方法用于实例化list集合和map public MyData() { list = new ArrayList<String>(); map = new HashMap<String, Integer>(); } //插入字符串str public void Insert(String str) { this.getList().add(str); //this.getList().size()-1 获取元素在list中的下标,然后将其放入map中建立字符串和下标的映射 this.getMap().put(str,this.getList().size()-1); } //按值查找字符串str的下标 public int searchStr(String str) { return this.getMap().get(str) == null ? -1 : this.getMap().get(str); } //查找下标为i的元素str public String searchNumber(int i) { return this.getList().get(i); } //删除字符串str根据字符串 public boolean remove(String str) { //提取删除元素的下标 int i = this.searchStr(str); if(i != -1) { //如果元素存在,不存在返回false; //先删除list和map中的str这个元素 this.getList().remove(str); this.getMap().remove(str); //然后重新给map建立映射 for(; i < this.getList().size() ; i++) { this.getMap().put(this.getList().get(i), i); } return true; }else { return false; } } //删除字符串str根据下标 public boolean remove(int i) { if(this.searchNumber(i) != null) { //如果元素存在,不存在返回false; //先删除list和map中的第i个元素 this.getMap().remove(this.getList().get(i)); this.getList().remove(i); //然后重新给map建立映射 for(; i < this.getList().size() ; i++) { this.getMap().put(this.getList().get(i), i); } return true; }else { return false; } } //显示元素 public void show() { for(String str : this.getList()) { System.out.print(" "+str+","); } } //geter seter方法 public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } public Map<String, Integer> getMap() { return map; } public void setMap(Map<String, Integer> map) { this.map = map; } } //测试 public class Test4 { public static void main(String[] args) { MyData md = new MyData(); //1.插入元素 md.Insert("Mary0"); md.Insert("Mary1"); md.Insert("Mary2"); md.Insert("Mary3"); md.Insert("Mary4"); md.Insert("Mary5"); md.Insert("Mary6"); // 插入元素后显示元素 System.out.print("插入元素后:"); md.show(); //2.删除元素"Mary3" md.remove("Mary3"); System.out.print("\n删除元素后1:"); //删除元素"Mary3",后显示元素 md.show(); //3.删除元素4 md.remove(4); System.out.print("\n个删除元素后2:"); md.show(); //4.查找下标为3的元素 System.out.print("\n查找下标为3的元素:"+md.searchNumber(3)); //5.查找元素Mary6的下标 System.out.print("\n查找元素\"Mary6\"的下标:"+md.searchStr("Mary6")); } }