面试遇到的算法题目

面试遇到的算法题目


把一个数分解为几个数之和
package com.arit;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

/**
 *
 * 使用隔板法实现求和组合
 *
 */
public class Qiuhe {
	
	public static List lists=new ArrayList();
	public static Set strs=new HashSet();
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		Integer num=sc.nextInt();
		parse1(num);
	}

	private static void parse1(int num) {
		if (num <= 1 || num >= Integer.MAX_VALUE)
			throw new IllegalArgumentException("参数非法!");
		//放置隔板,隔板个数为i,第一个隔板起始位置为j
		for (int i = 1; i < num; i++) {
			for (int j = 1; j <= num-i; j++) {
				List list1=new ArrayList();
				list1.add(j);
				if(i>1){
					parse2(list1,i-1,num-j);
				}else{
					list1.add(num-j);
					lists.add(list1);
				}		
			}
		}

		for (int i = 0; i < lists.size(); i++) {
			StringBuilder str1=new StringBuilder(num+"=");
			//排序
			Collections.sort(lists.get(i));
			//去重
			for (int j = 0; j  iterator = strs.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}
	}

	private static void parse2(List list1, int s,int num2) {				
		for (int k = 1; k <= num2-1; k++) {
			if(s>1){
				list1.add(k);
				parse2(list1,s-1,num2-k);
				list1.remove(list1.size()-1);
				continue;
			}else{
				List list2=new ArrayList();
				list2.addAll(list1);
				list2.add(k);
				list2.add(num2-k);
				lists.add(list2);
			}
		}
	}
}
输入两个正整数,格式:123/456,将两个数字倒转,即321/654
public class demo1 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("第一个数:");
        int num1 = input.nextInt();
        System.out.println("第二个数:");
        int num2 = input.nextInt();
        parse(num1,num2);
    }

    private static void parse(int num1, int num2) {
        StringBuilder sb = new StringBuilder();
        sb.append(num1+","+num2);
        sb=sb.reverse();
        String[] split = sb.toString().split(",");
        num1 = Integer.parseInt(split[0]);
        num2 = Integer.parseInt(split[1]);
        System.out.println(num1+"/"+num2+"="+num1+num2);
    }
从0-9随机8个不同的数,组成一个字符串,输出4个不同的字符串
public class demo2 {
    public static void main(String[] args) {
        parse();
    }
    private  static  void parse(){
        Set intSet = new HashSet<>();
        Set strSet = new HashSet<>();
        //先获取随机数并加入到set集合中
            while (true){
                int round = (int) Math.round(Math.random()*9);
                intSet.add(round);
                if(intSet.size()==8){
                    break;
                }
            }
//            将Set集合转换为list集合方便打乱顺序
        List intList = new ArrayList<>(intSet);
//            用Collections的shuffle方法进行打乱顺序并添加到Set集合
        while (true){
            Collections.shuffle(intList);
            strSet.add(intList.toString());
            if(strSet.size()==4){
                break;
            }
        }
        System.out.println(intSet);
        System.out.println(strSet);

    }
}
输出d盘下文件11.txt中的数字,只输出数字。例如:文件中为“111欢迎,222”,只输出111222
public class demo3 {
    public static void main(String[] args) throws IOException {
        parse();
    }
    private static void parse(){
        File file = new File("d://11.txt");
        try {
            FileInputStream inputStream = new FileInputStream(file);
            byte[] bytes = new byte[1024];
            int len =inputStream.read();
            inputStream.read(bytes, 0, len);
            String str = new String(bytes);  //取出文件中的内容
            System.out.println(str);
            String reg="[^0-9]"; //匹配不是0-9的任意字符
            Pattern compile = Pattern.compile(reg);
            Matcher matcher = compile.matcher(str);
            String trim = matcher.replaceAll("").trim();//将不是数字的替换为空字符串
            System.out.println(trim);

        }catch (IOException e){
            e.printStackTrace();
        }
    }

}
已知两个数组a和b,数组里的数字已经从小到大排好序,且每个数组里无重复数字,编写程序求数组c,c是a与b的并集,且c里的数字要从小到大排序,且不重复
package com.arit;

import java.util.Arrays;
import java.util.Collections;
import java.util.TreeSet;

/**
 * 已知两个数组a和b,数组里的数字已经从小到大排好序,且每个数组里无重复数字,
 * 编写程序求数组c,c是a与b的并集,且c里的数字要从小到大排序,且不重复,
 * 例如:a={1,3,8,20}
 *       b={2,3,11,12,15,20,26}
 * 附加要求:
 * 1)算法时间复杂度为o(m+n),下面程序不符合这个要求,因为其算法复杂度为o(m*n):
 * for(i=1 to m){
 *     for(j=1 to n){
 *
 *     }
 * }
 * 2)不允许使用现有数据结构及函数,必须按最原始的数组形式编写程序。
 * 3)为了达到o(m+n)的时间复杂度,算法总体思路如下:
 *      a的当前元素与b的当前元素进行比较,谁小,把谁的放到c里,
 *      转到下一个元素继续比较。如上例子,假设a的当前元素为8,
 *      b的当前元素为11,把8放到c里,然后继续拿a的下一个元素20跟b的当前元素11进行比较
 *
 *
 * */
public class demo4 {
    public static void main(String[] args) {
        parse();
//        parse1();
    }
    private  static  void  parse(){
        int[] a={1,3,8,20,2,222,14};
        int[] b={26,2,3,11,12,15,20};
        int c[] =null;
        TreeSet treeSet = new TreeSet<>(); //TreeSet是有序不重复的
        for (int i=0;ic[j+1]){
                    int temp = c[j+1];
                    c[j+1]=c[j];
                    c[j]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(c));*/

    }
   /* private static void parse1(){
        int[] a={1,3,8,20};
        int[] b={2,3,11,12,15,20,26};
        int[] c = new int[a.length + b.length];
        if(a.length
数据库(人员姓名,总花费,总销售)
# 人员表:人员姓名,人员ID
# 销售表:人员ID,时间,销售金额
# 花费表:人员ID,时间,花费金额

CREATE TABLE personnel(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(25));
CREATE TABLE sale(id INT,dale_date DATE,sale_money DECIMAL(10,2));
CREATE TABLE spend(id INT,spend_date DATE,spend_money DECIMAL(10,2));
INSERT INTO personnel(username)VALUES('张三'),('李四'),('王五');
INSERT INTO sale(id,dale_date,sale_money)VALUES(1,'2018-9-8',8975.2),(2,'2018-9-8',1973.2);
INSERT INTO spend(id,spend_date,spend_money)VALUES(1,'2018-9-8',897),(2,'2018-9-8',19);


-- 写出sql显示:人员姓名,总花费,总销售
-- 注意:需要使用子查询;

SELECT username 人员姓名,
	(
	SELECT SUM(sale_money)
	FROM sale
	WHERE sale.id =personnel.id
	GROUP BY id
	) 总花费,(
	SELECT SUM(spend_money)
	FROM spend
	WHERE spend.id = personnel.id
	GROUP BY id
	) 总销售
FROM personnel

你可能感兴趣的:(算法)