面试遇到的算法题目
把一个数分解为几个数之和
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