数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

public class Solution {
    /**
     * 采用阵地攻守的思想: 第一个数字作为第一个士兵,守阵地;count = 1;
     * 遇到相同元素,count++; 遇到不相同元素,即为敌人,同归于尽,count--;
     * 当遇到count为0的情况,又以新的i值作为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,
     * 有可能是主元素。 再加一次循环,记录这个士兵的个数看是否大于数组一般即可。
     * @param array
     * @return
     */
    public int MoreThanHalfNum_Solution(int[] array) {
        int length = array.length;
        if (array == null || length <= 0) {
            return 0;
        }
 
        int result = array[0];
        int times = 1;
        for (int i = 1; i < length; i++) {
            if (times == 0) {
                result = array[i];
                times = 1;
            else {
                if (array[i] == result) {
                    times++;
                else {
                    times--;
                }
            }
        }
 
         
        times = 0;
        for (int i = 0; i < length; i++) {
            if (result == array[i]) {
                times++;
            }
        }
 
        if (times * 2 < length) {
            result = 0;
        }
        return result;
    }
}

最小的K个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
import java.util.ArrayList;
public class Solution {
    /**
     * 最小的K个数
     * @param input
     * @param k
     * @return
     */
    public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
        ArrayList<Integer> aList = new ArrayList<Integer>();
        if (input.length < k || input == null) {
            return aList;
        }
        if (k == 0) {
            return aList;
        }
        int len = input.length;
        findSort(input, 0, len - 1, k);
        for(int i=0;i<k;i++){
            aList.add(input[i]);
        }
        return aList;
    }
 
    /*
    递归查找
    */
    private void findSort(int[] input, int p, int r, int k) {
        if (p == r) {
            return;
        }
        int q = partition(input, p, r);
        int temp = q - p + 1;///当前的长度
         
        if (temp == k) {
            return;
        } else if (k < temp) {
            findSort(input, p, q - 1, k);
        } else {
            findSort(input, q + 1, r, k - temp);
        }
 
    }
   /*
    分治法来实现最小k的查找/*
    */
    private int partition(int[] input, int p, int q) {
        int x = input[q];
        int i = p - 1;
        for (int j = p; j < q ; j++) {
            if (input[j] <= x) {
                i = i + 1;
                int temp = input[i];
                input[i] = input[j];
                input[j] = temp;
            }
        }
 
        input[q] = input[i + 1];
        input[i + 1] = x;
        return i + 1;
    }
}
连续子数组的最大和
题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class Solution {
    /*
    分治法求解最大字数组 这个算法自己曾经实现过 不过有些问题没有解决
     
    */
     
   public int FindGreatestSumOfSubArray(int[] array) {
        if (array.length == 0 || array == null) {
            return 0;
        }
         
        int result = findMaxSubArray(array, 0, array.length - 1);
        return result;
    }
 
    private int findMaxSubArray(int[] arr, int left, int right) {
        int result=0;
        if (left == right) {
            result=arr[left];
            return result;
        else {
            int mid = (left + right) / 2;
            int saleft = findMaxSubArray(arr, left, mid);
            int saright = findMaxSubArray(arr, mid+1, right);
 
            int sacross = findCrossingMaxSubArray(arr, left, mid,
                    right);
 
            if (saleft > saright
                    && saleft > sacross) {
                return saleft;
            else if (saright > saleft
                    && saright > sacross) {
                return saright;
            else {
                return sacross;
            }
        }
    }
 
    private int findCrossingMaxSubArray(int[] arr, int left, int mid, int right) {
        int sum=0;
        int begin=0;
        int end=0;
 
        int leftsum = arr[mid] ;
        sum=arr[mid];
        for(int i=mid-1;i>=left;i--){
            sum=sum+arr[i];
            if(sum>leftsum){
                leftsum=sum;
                begin=i;
            }
        }
        int rightsum = arr[mid+1];
        sum=arr[mid+1];
        for(int i=mid+2;i<=right;i++){
            sum=sum+arr[i];
            if(sum>rightsum){
                rightsum=sum;
                end=i;
            }
        }
        return leftsum+rightsum;
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Solution {
    public static int FindGreatestSumOfSubArray(int[] array) {
        if(array.length==0return 0;
        int sum = 0 ,result = array[0];
        for (int i = 0; i < array.length; i++) {
            if(sum<0)
                sum = array[i];
            else
                sum += array[i];
            result = Math.max(result, sum);
        }
        return result;
    }
}
整数中1出现的次数(从1到n整数中1出现的次数)
题目描述:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
 
        if(n<=0){
            return 0;
        }
        String str = Integer.toString(n);
        char[] strN=str.toCharArray();
         
        return NumberOf1(strN,0);
         
 
    }
 
    private int NumberOf1(char[] strN,int loc) {
        if(strN==null||strN[loc]<'0'||strN[loc]>'9'||strN[loc]=='\0'){
            return 0;
        }
         
        int first=strN[loc]-'0';
        //剩余长度
        int len = strN.length-loc;//剩余 长度 下标是从0开始
         
        if(len==1&&first==0){
            return 0;
        }
        if(len==1&&first>0){
            return 1;
        }
         
        int numFirstDigit=0;
        if(first>1){
            numFirstDigit=PowerBase10(len-1);
        }else if(first==1){
            numFirstDigit=Atoi(strN,loc+1)+1;//将后序的字符转换成为数值
        }
        //除了开头第一位的所有其他的四位数中的情况
        int numOtherDigit=first*(len-1)*PowerBase10(len-2);
         
        int numRecursive = NumberOf1(strN, loc+1);
         
        return numFirstDigit+numOtherDigit+numRecursive;
         
    }
 
    private int Atoi(char[] strN, int loc) {
        int num = 0;
        for(int i=loc;i<strN.length;i++){
            num=num*10+(strN[i]-'0');
        }
        return num;
    }
 
    private int PowerBase10(int n) {
         
        int res=1;
        for(int i=0;i<n;i++){
            res*=10;
        }
        return res;
    }
}
把数组排成最小的数
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.util.ArrayList;
 
public class Solution {
   /**
     * 生成最小数值的数组排列 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
     * 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
     *
     * @param numbers
     * @return
     *
     *         这个题目主要是想找到一个排序规则,数组根据这个排序规则来排成一个最小的数字。要确定排序规则就要比较两个数字,也就是比较
     *         m和n,我们需要一个规则判断m和n哪一个应该排在前面,而不是仅仅比较两个数字的值哪个更大。
     *
     *         根据题目要求,两个数字m和n 拼接成为mn和nm如果mn小于nm,那么我们应该打印出mn,也就是m应该排在n 的前面。
     *         我们定义此时m<n.这是我们自定义的大小比较关系。
     *
     *         拼接称为字符串,按照字符串比较大小就可以了。
     */
    public String PrintMinNumber(int[] numbers) {
 
        if (numbers.length == 0 || numbers == null) {
            return "";
        }
 
        int len = numbers.length;
        String[] strNums = new String[len];
        for (int i = 0; i < len; i++) {
            strNums[i] = Integer.toString(numbers[i]);
            // construct string from a int array
        }
 
        String res = qSortStrArray(strNums, len);
 
        return res;
    }
 
    private String qSortStrArray(String[] strNums, int len) {
        if (strNums == null || strNums.length == 0)
            return null;
         
        for(int i=0;i<len-1;i++){
            for(int j=i;j<len;j++){
                if((strNums[i]+strNums[j]).compareTo(strNums[j]+strNums[i])>0){
                    String temp = strNums[i];
                    strNums[i]=strNums[j];
                    strNums[j]=temp;
                }
            }
        }
         
        String res="";
        for(int i=0;i<len;i++){
            res+=strNums[i];
        }
        return res;
 
    }
}
posted @ 2016-04-02 22:23 snowwolf101 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 容易实现的算不上梦想,轻易放弃的算不上诺言。 要想成功得敢于挑战,有了梦想才有美好的明天! 前言:面试的时候我们经常遇到难题,画图、举例子和分解能够很好的帮助我们解决问题和细化问题。 一、画图使得抽象问题形象化 1. 二叉树镜像 操作给定的二叉树,将其变换为源二叉树的镜像。 ... 阅读全文
posted @ 2016-03-22 21:39 snowwolf101 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 一、代码的完整性 1. 数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 p... 阅读全文
posted @ 2016-03-21 16:26 snowwolf101 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 参考博客:http://blog.csdn.net/jason0539/article/details/23297037 参考书籍:《剑指offer》 0. 注意不要抱怨的问题 老板太苛刻同时太难相处加班太频繁工资太低 1. 技术面试看点 扎实的基础知识:一门语言+数据结构+算法设计 高... 阅读全文
posted @ 2016-03-20 11:40 snowwolf101 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 武侠: 飞雪连天射白鹿,笑书神侠倚碧鸳。 ——金庸十四著作 飞狐外传 、雪山飞狐 、连城诀 、天龙八部 、射雕英雄传 、白马啸西风 、鹿鼎记 、笑傲江湖 、书剑恩仇录 、神雕侠侣 、侠客岛 、倚天屠龙记 、碧血剑 、鸳鸯刀 (除此之外还缺少越女剑)。声明:本文参考了华... 阅读全文
posted @ 2016-03-17 21:22 snowwolf101 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 我的心灵告诫我,它教我不要因一个赞颂而得意,不要因一个责难而忧伤。树木春天开花夏天结果并不企盼赞扬,秋天落叶冬天凋敝并不害怕责难。——纪伯伦 《算法导论》学习笔记1.前言 类似于动态规划,贪心算法通常用于最优化问题,我们做出一组选择来达到最优解。贪心算法的思想是每步选择... 阅读全文
posted @ 2016-03-15 22:15 snowwolf101 阅读(390) 评论(0) 推荐(0) 编辑
摘要: Age wrinkles the body. Quitting wrinkles the soul. 岁月使皮肤起皱,放弃使灵魂起皱。——Douglas MacArthur(道格拉斯.麦克阿瑟) 《 算法导论》 学习笔记1. 概述 利用最优二叉搜索树来实现树的搜索代价最... 阅读全文
posted @ 2016-03-11 15:24 snowwolf101 阅读(1421) 评论(0) 推荐(0) 编辑
摘要: 这个世界上根本就不存在“不会做”这回事,当你失去了所有的依靠的时候,自然就什么都会了。0. 前言 最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法,作为码农,此算法是我们的必备基本功。最长公共子串(Longest Common Substirng)和最长公共... 阅读全文
posted @ 2016-03-10 18:10 snowwolf101 阅读(330) 评论(0) 推荐(0) 编辑
摘要: 实验室催促毕业论文进展,所以今天下午我得收拾一下,准备一下毕业论文需要弄的东西。 唉, 感觉自己就是太笨了。 ——题外话。1.动态规划的原理[1] 什么情况下使用动态规划? 适合应用动态规方法的求解最优化问题应该具备两个要素:最优子结构和子问题重叠。使用动态规划方法求解最... 阅读全文
posted @ 2016-03-09 11:04 snowwolf101 阅读(557) 评论(0) 推荐(0) 编辑
摘要: 有人说:越炫耀什么,越缺少什么。但我却以为:越缺少什么,越觉得别人炫耀什么。 ——李宫俊《李宫俊的诗》0. 前言 参考图书《算法导论》 动态规划通常用来解决最优化问题,在这类问题中,我们通常做出一组选择来表达最优解。在做出这个选择的同时,通常会生成与原问题形式相同的子... 阅读全文
posted @ 2016-03-07 21:54 snowwolf101 阅读(254) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示