• 扬帆起航,再踏征程(三)


    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53588062 冷血之心的博客)

    题目1

    找到第一次出差错的版本

          每个项目开发时,我们用代码版本控制工具,每次提交都会更新代码版本。版本号从1到n递增。有人提交代码后,导致后续的代码在单元测试中,都是错的。

    请找到第一个错误的版本号。

    代码如下:

    package com.ywq.test1;
    
    import org.junit.Test;
    
    
    public class Solution1 implements VersionControl {
    
        @Test
    	public void test(){
        	int result = findFirstBadVersion(9);
    	    System.out.println("第一个错误版本为:"+result);
    	}
    	
    
    	public  int findFirstBadVersion(int n) {
    
    		int left = 1;
    		int right = n;
    
    		//建立循环,目标是找出好、坏的分界点。
    		while (left + 1 < right) {
    			int mid=(left+right)/2;
    			boolean flag = isBad(mid);
    
    			if (flag) {
    				right = mid;
    			} else {
    				left = mid;
    			}
    		}
           
    //		当退出循环时,left和right相差1
    		if(isBad(left)){
    			return left;
    		}else {
    			return right;
    		}
    
    	}
    
    	@Override
    	public boolean isBad(int k) {		
    		if (k >= 3) {
    				return true;
    			} else {
    				return false;
    			}
    		
    	}
    
    }
    
    interface VersionControl {
    	public boolean isBad(int k); 
    }
    
    


     

    题目2:
    合并两个有序的链表。其中链表的节点的数据结构如下:
    public class ListNode {
         public int val;
         public ListNode next;
    

         public ListNode(int val) {
             this.val = val;
             this.next = null;
         }
    }
    

    代码如下:

    package com.ywq.test2;
    
    import org.junit.Test;
    
    public class Solution2 {
    
    	@Test
    	public void test() {
    		//创建有序链表list1  0-2-5-7-9
    		ListNode list1 = new ListNode(0);  
    		list1.next = new ListNode(2);  
    		list1.next.next = new ListNode(5);  
    		list1.next.next.next = new ListNode(7); 
    		list1.next.next.next.next = new ListNode(9);
    	 
    		//创建有序链表list2  1-3-6-8
            ListNode list2 = new ListNode(1);  
            list2.next = new ListNode(3);  
            list2.next.next = new ListNode(6);  
            list2.next.next.next = new ListNode(8); 
      
            //调用合并方法
            ListNode list3 = mergeKLists(list1, list2); 
            //将结果输出
            while (list3 != null) {  
                System.out.println(list3.val);  
                list3 = list3.next;  
            }  
    	}
    
    	public ListNode mergeKLists(ListNode list1, ListNode list2) {
    		
    		ListNode result=null;
    		
    		if (list1 == null && list2 == null) {  
                return null;  
            }  
            if (list1 == null) {  
                result = list2;  
                return result;  
            }  
            if (list2 == null) {  
                result = list1;  
                return result;  
            }  
            if (list1.val > list2.val) {  
                result = list2;  
                list2 = list2.next;  
            } else {  
                result = list1;  
                list1 = list1.next;  
            }  
            result.next = mergeKLists(list1, list2);  
            
            return result;  
    		
    	     
    	
    	}
    	
    }
    
    
    class ListNode {
        public int val;
        public ListNode next;
    
        public ListNode(int val) {
            this.val = val;
            this.next = null;
        }
    }
    
    


     

    题目3
    两数之和
    给一个整数数组,找到两个数使得他们的和等于一个给定的数target
    你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。

     

    代码如下:

    package com.ywq.test3;
    
    import java.util.HashMap;
    
    import org.junit.Test;
    
    public class Solution3 {
    
    	@Test
    	public void test() {
    		int[] a = { 2, 4, 8, 12, 5 };
    		int target = 17;
    		int[] sum = twoSum(a, target);
    		for (int i : sum) {
    			System.out.println(i);
    		}
    	}
    
    	public int[] twoSum(int[] a, int target) {
    
    		//创建结果数组
    		int[] result = new int[2];
    		
    		HashMap<Integer, Integer> map = new HashMap<>();
    		
    		//建立循环,遍历target-a[i]是否在map中
    		for (int i = 0; i < a.length; i++) {
    			
    			if (map.containsKey(target - a[i])) {
    				
    				//确定输出角标的先后顺序
    				if (i > map.get(target - a[i])) {
    					
    					result[0] = map.get(target - a[i]);
    					result[1] = i;
    					
    				} else {
    					
    					result[0] = i;
    					result[1] = map.get(target - a[i]);
    				}
    				
    			} else {
    				map.put(a[i], i);
    			}
    		}
    		return result;
    
    	}
    }
    


     

    题目4
    生产者消费者
    写代码实现:
    3个生产者生产消息,放到一个队列里。5个消费者消费消息。
    生产者生产的消息格式:
    生产者 ID + 时间戳 + 随机文本
    消费者消费消息后,打印出消费者 ID 和消费的内容。
    举例:
    producer message:
    1002_${timestamp}_helloworld42129
     
    consumer:

    consumer ID = 2003, consume message:1002_${timestamp}_helloworld42129

    代码如下:

    package com.ywq.test5;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingQueue;
    
    public class Solution4 {
    	
    	public static void main(String[] args) {
    		BlockingQueue q = new LinkedBlockingQueue();
    		Producer p1 = new Producer(q);
    		Producer p2 = new Producer(q);
    		Producer p3 = new Producer(q);
    		
    		Consumer c1 = new Consumer(q);
    		Consumer c2 = new Consumer(q);
    		Consumer c3 = new Consumer(q);
    		Consumer c4 = new Consumer(q);
    		Consumer c5 = new Consumer(q);
    		
    		p1.setName("生产者1");
    		p2.setName("生产者2");
    		p3.setName("生产者3");
    		
    		c1.setName("消费者1");
    		c2.setName("消费者2");
    		c3.setName("消费者3");
    		c4.setName("消费者4");
    		c5.setName("消费者5");
    		
    
    		p1.start();
    		p2.start();
    		p3.start();
    		c1.start();
    		c2.start();
    		c3.start();
    		c4.start();
    		c5.start();
    	}
    }
    
    class Producer extends Thread {
    	private final BlockingQueue queue;
       
    	Producer(BlockingQueue q) {
    		queue = q;
    	}
    
    	// 获取当前时间
    	public String getTime() {
    		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
    		String time = df.format(new Date());// new Date()为获取当前系统时间
    
    		return time;
    
    	}
    
    	public void run() {
    		while (true) {
    			try {
    			
    				System.out.println("生产者生产的消息为:"+Thread.currentThread().getName() +" "+ getTime()+" "+Math.random());
    				queue.put(Thread.currentThread().getName() +" "+ getTime()+" "+Math.random());
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    
    	}
    
    }
    
    class Consumer extends Thread {
    	private final BlockingQueue queue;
    
    	Consumer(BlockingQueue q) {
    		queue = q;
    	}
    
    	public void run() {
    		while (true) {
    			try {
    				System.out.println("consumer ID="+Thread.currentThread().getName() +", "+"consumer message:"+ queue.take());
    				Thread.sleep(20000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    
    	}
    
    }
    


     

    如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以加群366533258交流讨论哈~

     

     

     

  • 相关阅读:
    函数嵌套,层级嵌套函数就是闭包,包就是一层的意思,闭就是封装的意思封装的变量
    高阶函数
    装饰器=高阶函数+函数嵌套+闭包
    生产者和消费者模型
    【HDOJ】Power Stations
    【HDOJ】5046 Airport
    【HDOJ】3957 Street Fighter
    【HDOJ】2295 Radar
    【HDOJ】3909 Sudoku
    【POJ】3076 Sudoku
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467227.html
Copyright © 2020-2023  润新知