zoukankan      html  css  js  c++  java
  • 时间效率算法(Java实现)

    <一>数组中出现次数超过一半的数字:

    1.题目描述

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
    分析:
      找的数超过数组总数的一半,先把数组排序,这个数若存在必然在中间出现一次
      找到最中间的数,那最中间的数作为比较数去遍历整个数组,记录它出现的次数
      次数和len比较,超过len的二分之一则把中间那个数返回,没超过就输出0;
    代码如下:
    import java.util.Arrays;
    public class Solution {
        public int MoreThanHalfNum_Solution(int [] array) {
            
            int len = array.length;
            
            if(len < 0){
                return 0;
            }
            Arrays.sort(array);
            int temp = array[len / 2];
            int count = 0;
            
            for(int i = 0;i < len;i++){
                if(array[i] == temp){
                    count++;
                }
            }
            
            //不能等于,因为是除
            if(count > (len / 2)){
                return temp;
            }
            return 0;
        }
    } 
    

     <二>最小的K个数

    题目描述

    输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
    直接按照Java内部的接口来实现,代码如下:
    import java.util.Arrays;
    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
            
            ArrayList<Integer> res  =new ArrayList<>();
            int len = input.length;
            
            if(input == null || k > len){
                return res;
            }
            Arrays.sort(input);
            
            for(int i = 0;i < k;i++){
                res.add(input[i]);
            }
            return res;
            
        }
    }
    

    试了冒泡、选择和插入排序。程序的测试用例过不去,可能是时间复杂度高了。

    <三>连续子数组的最大和

    题目描述

    HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1):
    代码如下:
     
    import java.util.ArrayList;
    import java.util.Collections;
    
    public class Solution {
        public int FindGreatestSumOfSubArray(int[] array) {
            
            int len = array.length;
            ArrayList<Integer> list = new ArrayList<>();
            
            for(int i = 0;i < len;i++){
                int sum = 0;
                for(int j = i;j < len;j++){
                    sum += array[j];
                    list.add(sum);
                }
            }
            if(list.size() <= 0){
                return 0;
            }
            Collections.sort(list);
            return list.get(list.size() - 1);
        }
    }
    

    <四>整数中1出现的次数(从1到n整数中1出现的次数

    题目描述

    求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
    代码如下:
    public class Solution {
        public int NumberOf1Between1AndN_Solution(int n) {
        
            if(n < 0){
                return 0;
            }
            int count = 0;
            while(n > 0){
                String str = String.valueOf(n);
                char[] ch = str.toCharArray();
                for(int i = 0;i < ch.length;i++){
                    if(ch[i] == '1'){
                        count++;
                    }
                }
               n--;
            }
            return count;
        }
    }
    

     <五>把数组排成最小的数

    题目描述

    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
     代码如下:
     
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Comparator;
    
    public class Solution {
    public String PrintMinNumber(int [] numbers) {
            if(numbers == null || numbers.length == 0){
                return "";
            }
            int len = numbers.length;
            String [] str = new String[len];
            StringBuffer sb = new StringBuffer();
            for(int i = 0;i < len;i++){
                str[i] = String.valueOf(numbers[i]);
            }
            Arrays.sort(str,new Comparator<String>() {
    			@Override
    			public int compare(String str1,String str2) {
    				String c1 = str1 + str2;
    				String c2 = str2 + str1;
    				return c1.compareTo(c2);
    			}
    		});
            for(int j = 0;j < len;j++) {
            	sb.append(str[j]);
            }
    		return sb.toString();
        }
    }
    
     
  • 相关阅读:
    web服务器-Apache
    nginx优化
    nginx下载限速
    nginx-URL重写
    HDU 5358 First One 求和(序列求和,优化)
    HDU 5360 Hiking 登山 (优先队列,排序)
    HDU 5353 Average 糖果分配(模拟,图)
    UVALive 4128 Steam Roller 蒸汽式压路机(最短路,变形) WA中。。。。。
    HDU 5348 MZL's endless loop 给边定向(欧拉回路,最大流)
    HDU 5344 MZL's xor (水题)
  • 原文地址:https://www.cnblogs.com/youdiaodaxue16/p/11355310.html
Copyright © 2011-2022 走看看