遇到的题目
一起学习
数据库理解
下面关于数据库说法正确的是:
A. 不小心drop table删库后,只需执行ctrl+z撤销命令,便可恢复数据
B. 第一范式(1-NF)不允许表中有子表,但BC范式(BC-NF)允许
C. 事务的四个特征是:原子性、一致性、持续性和隔离性
D. 数据库中的主键和外键均可以有多个
答案 C
解析
A项,当采用默认的自动事务时,删除表可以回撤。当开启手动事务,且删除表后提交事务,则不能再回撤;B项,第一范式指的是表中每一个一段不可再分,每一个字段都是独立的;C项,事务的四个基本特性;D项,主键只有一个,约束和在外键可以有多个
JAVA重写问题
下列代码的输出结果是:
public class A {
String name="a";
String go(){
return "- function in A";
}
}
public class B extends A {
String name="b";
String go(){
return "- function in B";
}
public static void main(String[] args) {
A a= new B();
System.out.println(a.name+a.go());
}
}
答案 a - function in B
解析
属性不存在重写,只有方法才存在重写
编程题
字符串是否由子串拼接
给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。
例如,"abcabcabc"满足条件,因为它是由"abc"首尾拼接而成的,而"abcab"则不满足条件。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String str = in.nextLine();
System.out.println(get(str));
}
//暴力寻找重复的子串
public static String get(String str){
int len = str.length();
for(int i=len/2; i>0; i--){
if(len%i == 0){
int times = len/i;
String s = str.substring(0,i);
StringBuilder sb = new StringBuilder();
for(int j=0; j<times; j++){
sb.append(s);
}
if(sb.toString().equals(str)){
return s;
}
}
}
return "false";
}
}
寻找合法字符串
给出一个正整数n,请给出所有的包含n个’(‘和n个’)‘的字符串,使得’(‘和’)‘可以完全匹配。
例如:
‘(())()’,’()()()’ 都是合法的;
'())()('是不合法的。
请按照__字典序__给出所有合法的字符串。
//全排列问题要想到DFS,注意递归过程中判断合法性
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = newScanner(System.in);
int n = in.nextInt();
List<String> list = newArrayList<>();
DFS(0, 0, n, "", list);
for(inti=0;i<list.size()-1;i++){
System.out.print(list.get(i)+",");
}
System.out.println(list.get(list.size()-1));
}
public static void DFS(intnum1, intnum2, intn, String str, List<String> list) {
if(num1==n && num1+num2==2*n) list.add(str);
if(num1<n && num1>=num2 && num1+num2<2*n) DFS(num1+1, num2, n, str+'(', list);
if(num2<n && num1+num2<2*n) DFS(num1, num2+1, n, str+')', list);
return;
}
}
整数成绩最大化
给出一个整数n,将n分解为至少两个整数之和,使得这些整数的乘积最大化,输出能够获得的最大的乘积。
例如:
2=1+1,输出1;
10=3+3+4,输出36。
//n=(多个)(3+3+...+3)+a;(a<3);若a=1;则n=(3+3+...+3)(k-1个)+4;把n拆成多个3相乘可达最大
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int three = n / 3;
if (((n - three * 3) & 1) == 1) { three--; }
int two = (n - three * 3) / 2;
int result = (int)(Math.pow(3, three) * Math.pow(2, two));
System.out.println(result);
}
}