# 1.算法练习题(第一章概论)


1.算法练习题(第一章概论)


  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);
    	}
    }
    

  2. 一个字符串采用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");
    	}
    }
    

  3. 有一个整数序列,设计一个算法判断其中是否存在两个元素的和恰好等于给定的整数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);
    	}
    }
    

  4. 编写一个实验程序,随机产生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);
    		}
    }
    
    

  5. 编写一个实验程序,利用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));
    		}
    	}
    }
    
    
    
    

  6. 编写一个实验程序,对于一个含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);
    	}
    }
    
  7. 编写一个实验程序,设计一种好的数据结构尽可能高效的实现元素的插入(元素)、删除(按值或者按下标)、按值查找(元素下标)和按序号查找(元素)(假设所有元素值都不相同).

    /**
     * 编写一个实验程序,设计一种好的数据结构尽可能高效的实现
     * 元素的插入、删除、按值查找和按序号查找(假设所有元素值都不相同).
     * @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"));
    	}
    }
    
    


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM