算法学习之剑指offer(六)

题目1

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
import java.util.*;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(input.length<k||k==0)
            return list;
        for(int i=0;i<k;i++){
			list.add(input[i]);
        }
        for(int i=k;i<input.length;i++)
        {
            int max_index = getMax(list);
            int max_val = list.get(max_index);
            if(max_val>input[i])
            {
                list.set(max_index,input[i]);
            }
        }
        return list;
    }
    
    public int getMax(ArrayList<Integer> list){
        int max_index = 0;
        for(int i=0;i<list.size();i++){
            if(list.get(max_index)<list.get(i))
                max_index=i;
        }
        return max_index;
    }
}
题目2

题目描述

输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。
找规律得到的算法:
public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
        if(array==null||array.length==0)
            return 0;
    
        int result = array[0],num=0;
        for(int i=0;i<array.length;i++){
            if(num<=0)
                num=array[i];
            else
                num+=array[i];
            if(num>result)
                result=num;
        }
        return result;
    }
}
题目3

题目描述

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

纯属找数字规律的题。提供一种最一般的解法

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
    	 int count=0;
        while(n>0){
            String str=String.valueOf(n);
            char [] chars=str.toCharArray();
            for(int i=0;i<chars.length;i++){
                if(chars[i]=='1')
                    count++;
            }
            n--;
        }
        return count;
    }
}
题目4

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
import java.util.ArrayList;
import java.util.*;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
		ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i=0;i<numbers.length;i++){
			list.add(numbers[i]);
        }
        Collections.sort(list,new Comparator<Integer>(){
            public int compare(Integer a,Integer b){
                int s1 = Integer.parseInt(a+""+b);
                int s2 = Integer.parseInt(b+""+a);
                return s1>s2?1:-1;
            }
        });
        StringBuilder sb = new StringBuilder();
        for(Integer i:list)
            sb.append(i+"");
        return sb.toString();
    }
}
题目5


题目描述

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
import java.util.*;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index==0)
        	return 0;
        Queue<Integer> q2 = new LinkedList<Integer>();
        Queue<Integer> q3 = new LinkedList<Integer>();
        Queue<Integer> q5 = new LinkedList<Integer>();
        q2.add(2);q3.add(3);q5.add(5);
        int num=1,min,ugly=1;
        while(num!=index){
            ugly = Math.min(q2.peek(),Math.min(q3.peek(),q5.peek()));
			if(ugly==q2.peek()){
               q2.add(ugly*2);q3.add(ugly*3);q5.add(ugly*5);q2.poll();
           }
           if(ugly==q3.peek()){
               q3.add(ugly*3);q5.add(ugly*5);q3.poll();
           }
           if(ugly==q5.peek()){
               q5.add(ugly*5);q5.poll();
           }
           num++;
        }
        return ugly;
    }
}
题目6

题目描述

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
import java.util.*;
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if(str.length()==0)
            return -1;
        HashMap<Character,Integer> hm = new LinkedHashMap<Character,Integer>();
        char[] chars = str.toCharArray();
        for(Character c:chars){
            int times;
            Integer i = hm.get(c);
            times=(i==null)?1:i.intValue()+1;
            hm.put(c,times);
        }
        int index=0;;
        for(Character c:hm.keySet()){
            int k = hm.get(c);
            if(hm.get(c)==1){
                index = str.lastIndexOf(c);
                break;
            }
        }
        return index;
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值