目录
选择题
- 关系数据库逻辑性强物理性弱
- 视图指计算机中数据库的视图,是一个虚拟表,内容由查询定义,如同真实的表一样,含有一系列列和行
- 但是视图并不在数据库中以存储的数据值集形式存在
- 视图一经定义无法修改
- 数据定义语言DDL用来创建数据库中的各种对象,比如表,视图,索引等等
- 数据操作语言DML,负责数据的基本操作,增删查改
- 数据控制语言DCL:比如授权回滚提交等操作
- 应该是从分组结果中筛选行
编程题
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.*; public class Main{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Scanner sc=new Scanner(System.in); String str=sc.nextLine(); int count=0; for (int i = 0; i < str.length(); i++) { if(str.charAt(i)=='"'){ do{ i++; }while (str.charAt(i)!='"'); } if(str.charAt(i)==' '){ count++; } } System.out.println(count+1); int flag=1; for (int i = 0; i < str.length(); i++) { //遇到第一个",flag变0 //遇到第二" 结束后flag变1 //flag为0的时候,说明在打印双引号的东西 if(str.charAt(i)=='"'){ flag^=1; } if(str.charAt(i)!=' '&&str.charAt(i)!='"'){ System.out.print(str.charAt(i)); } if(str.charAt(i)==' '&&flag==0){ System.out.print(str.charAt(i)); } if(str.charAt(i)==' '&&flag==1){ System.out.println(); } } } }
- 这里面最牛逼的处理就是flag的应用,一个异或操作,就能分清是第一次遇到”还是第二次遇到双引号
import java.util.*; public class Main{ public static void main(String args[]){ Scanner sc = new Scanner(System.in); String str = sc.nextLine(); int count=0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i)=='"'){ do { i++; }while (str.charAt(i)!='"'); } if(str.charAt(i)==' '){ count++; } } String arr[]=new String[100]; for (int i = 0; i < 100; i++) { arr[i]=""; } int count1=0; int i=0; while(i<str.length()){ if(str.charAt(i)=='"'){ i++; while(str.charAt(i)!='"'){ arr[count1]+=str.charAt(i)+""; i++; } i++; }else{ if(str.charAt(i)==' '){ count1++; i++; }else { arr[count1]+=str.charAt(i)+""; i++; } } } System.out.println(count+1); for(int j=0;j<count+1;j++){ System.out.println(arr[j]); } } }
这题用动态规划
package days.day13; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main2 { public static void main(String[] args) { int n=0; int m=0; Scanner sc=new Scanner(System.in); n=sc.nextInt(); m=sc.nextInt(); System.out.println(getMinCount(n,m)); } public static int getMinCount(int n,int m){ if(n==m){ return 0; } if(n>m){ return -1; } List<Integer> list=getStep(n); int min=Integer.MAX_VALUE; for (int step: list) { int res=getMinCount(n+step,m); if(res==-1){ continue; } min=Math.min(m,1+res); } return min==Integer.MAX_VALUE?-1:min; } public static List<Integer> getStep(int num){ List<Integer> list=new ArrayList<>(); for (int i = 2; i < num; i++) { if(num%i==0){ list.add(i); } } return list; } }
- 这是暴力枚举的方法,用递归将每一种的情况都计算进去,时间复杂度肯定不符合规定,解决方法就是自底向上
自底向上
import java.util.*; public class Main { public static void main(String[] args) { int n=0 ; int m=0; Scanner sc=new Scanner(System.in); n=sc.nextInt(); m=sc.nextInt(); int dp[]=new int[m+1]; Arrays.fill(dp,m+1); dp[n]=0;//base case for (int i = n; i <m; i++) { if(dp[i]==m+1){ continue; } List<Integer> list=getStep(i); for (int step: list ) { if(i+step<=m && dp[i+step]!=m+1){ dp[i+step]=Math.min(dp[i+step],dp[i]+1);//状态转换方程 }else if (i+step<=m && dp[i+step]==m+1){ dp[i+step]=dp[i]+1; } } } dp[m]=(dp[m]==m+1)?-1:dp[m]; System.out.println(dp[m]); } public static List<Integer> getStep(int num){ List<Integer> list=new ArrayList<>(); for (int i = 2; i*i<=num; i++) { if(num%i==0){ list.add(i); if(num/i!=i){ list.add(num/i); } } } return list; } }