深度优先

这个家伙好懒,除了文章什么都没留下

0%

额,学了一个多月的Oracle数据库,感觉还是什么都不会呢。之前学过sql server数据库,数据库蛮都差不多,语法基本上是通用的。

Oracle学着并没有感到它有多安全,然而操作麻烦是真的,编辑界面又丑,也不是蛮人性化。记个笔记吧,以后用到了直接翻。

先来个刚用到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
--创建表空间
create tablespace OralData
datafile 'D:\OralData.bdf'
size 3M
autoextend on;

--创建用户
create user gg
identified by abc;

--授权
grant connect to gg;
grant resource to gg;

--创建表Users
create table Users
(
UserID number not null primary key,
UserName varchar(50) not null,
UserPwd varchar(50) not null,
UserRole number(4) not null
);

select * from Users where UserName='张三' and UserPwd='admin'

--创建表Question
create table Question
(
QuestionID number(4) not null primary key,
CourseID number(4) not null references Course(CourseID),
Title varchar(200) not null,
OptionA varchar(40) not null,
OptionB varchar(40) not null,
OptionC varchar(40) not null,
OptionD varchar(40) not null,
Answer char(1) not null
);

--创建表Course
create table Course
(
CourseID number(4) not null primary key,
CourseName varchar(20) not null,
Semester varchar(10) not null
);

select CourseID,CourseName from Course where Semester='上学期';

--创建三个序列
create sequence Use_id
increment by 1
start with 1
nomaxvalue
nocycle;

create sequence Que_id
increment by 1
start with 1
nomaxvalue
nocycle;

create sequence Cou_id
increment by 1
start with 1
nomaxvalue
nocycle;

--插入数据
insert into Users values(Use_id.Nextval,'张三','admin',1);
insert into Users values(Use_id.Nextval,'李四','admin',1);
insert into Users values(Use_id.Nextval,'王五','admin',1);
insert into Users values(Use_id.Nextval,'赵六','admin',1);
insert into Users values(Use_id.Nextval,'管老师','admin',2);

insert into Course values(Cou_id.Nextval,'语文','上学期');
insert into Course values(Cou_id.Nextval,'数学','上学期');
insert into Course values(Cou_id.Nextval,'英语','下学期');
insert into Course values(Cou_id.Nextval,'物理','下学期');

insert into Question values(Que_id.Nextval,1,'理想,今年你几岁?','3','18','30','100','A');
insert into Question values(Que_id.Nextval,3,'1+1等于几,不能说是2哦?','0','1','2','22','C');
insert into Question values(Que_id.Nextval,3,'what why where when','what','why','where','when','B');
insert into Question values(Que_id.Nextval,4,'牛顿的重力加速度是多少?','0.98','9.8','98','980','B');

commit;

一些细节的

1
2
SQL> --设置当前日期格式
SQL> alter session set nls_date_format='YYYY-MM-DD'

你一定听说过“数独”游戏。
如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。

数独的答案都是唯一的,所以,多个解也称为无解。

本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。

例如:
输入(即图中题目):
005300000
800000020
070010500
400005300
010070006
003200080
060500009
004000030
000009700

程序应该输出:
145327698
839654127
672918543
496185372
218473956
753296481
367542819
984761235
521839764

再例如,输入:
800000000
003600000
070090200
050007000
000045700
000100030
001000068
008500010
090000400

程序应该输出:
812753649
943682175
675491283
154237896
369845721
287169534
521974368
438526917
796318452

资源约定:
峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 2000ms

突然发现dfs真神奇,好多题都可以解决。搜索+递归+回溯!哈哈哈

这个题是站在大神的肩膀上做出来的,在他给的思路上进行了完善。

具体算法,代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
public class 数独 {

static int[][] data=new int[][]{
{0,0,5,3,0,0,0,0,0},
{8,0,0,0,0,0,0,2,0},
{0,7,0,0,1,0,5,0,0},
{4,0,0,0,0,5,3,0,0},
{0,1,0,0,7,0,0,0,6},
{0,0,3,2,0,0,0,8,0},
{0,0,0,5,0,0,0,0,9},
{0,0,4,0,0,0,0,3,0},
{0,0,0,0,0,0,7,0,0}
};
static int[][] mark=new int[9][9];
static boolean flag=true;
static boolean ok=false;
static int cnt;
public static void main(String[] args) {

long t1=System.currentTimeMillis();
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if(data[i][j]!=0)
mark[i][j]=1;
}
}
dfs(0,0);
long t2=System.currentTimeMillis();
System.out.println(t2-t1);
}
private static void dfs(int m, int n) {

if(ok==true)
return;

if(m==8&&n==9){
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
System.out.print(data[i][j]+" ");
}
System.out.println();
}
//System.out.println("--------------------------");
ok=true;//true
return;
}
else{
if(n==9){//到了一行的边界
dfs(m+1,0);//跳到下一行
return;
}
if(mark[m][n]==1){//若填过了
dfs(m,n+1);//跳到下一各
return;
}

for (int i = 1; i <= 9; i++) {

aa:for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9; y++) {
//所在行和列都可以填
if(mark[m][y]==1&&data[m][y]==i||
mark[x][n]==1&&data[x][n]==i){
flag=false;
break aa;
}
}
}
//检查所在方阵
if(flag){
int z=m/3;
int v=n/3;
bb:for (int j = 0; j < 3; j++) {
for (int l = 0; l < 3; l++) {
if(mark[z*3+j][v*3+l]==1&&data[z*3+j][v*3+l]==i){
flag=false;
break bb;
}
}
}
}
if(flag==true){
mark[m][n]=1;
data[m][n]=i;
dfs(m,n+1);
mark[m][n]=0;
}
flag=true;
}
}
}
}

1、则表达式

java中提供了对正则表达式的支持。
有的时候,恰当地使用正则,可以让我们的工作事半功倍!

如下代码用来检验一个四则运算式中数据项的数目,请填写划线部分缺少的代码。

注意:只填写缺少代码,不要写任何多余内容,例如,已有的双引号。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package 校内选拔2015;

public class T1
{
public static int f(String s)
{
return s.split("\\p{Punct}").length;
}

public static void main(String[] args)
{
System.out.println(f("12+35*5-2*18/9-3")); //7
System.out.println(f("354*12+3-14/7*6")); //6
}
}

2、达到或超过 15.0

1/1 + 1/2 + 1/3 + 1/4 + … 在数学上称为调和级数。

它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。

但是,它发散的很慢:

前1项和达到 1.0
前4项和才超过 2.0
前83项的和才超过 5.0

那么,请你计算一下,要加多少项,才能使得和达到或超过 15.0 呢?

请填写这个整数。

注意:只需要填写一个整数,不要填写任何多余的内容。比如说明文字。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package 校内选拔2015;

import java.math.BigDecimal;;

public class T2 {

public static void main(String[] args) {

//1/1 + 1/2 + 1/3 + 1/4 + ... 在数学上称为调和级数。

BigDecimal bd=BigDecimal.ONE;

BigDecimal sum=BigDecimal.ZERO;
int i=1;//1835422
while(sum.subtract(BigDecimal.valueOf(15)).doubleValue()<0) {
sum=sum.add(bd.divide(BigDecimal.valueOf(i),120,BigDecimal.ROUND_HALF_UP));
//System.out.println(i+": "+sum);
i++;
}
System.out.println(i);
}
}

3、x的x次幂结果为10

如果x的x次幂结果为10(参见【图1.png】),你能计算出x的近似值吗?


显然,这个值是介于2和3之间的一个数字。

请把x的值计算到小数后6位(四舍五入),并填写这个小数值。

注意:只填写一个小数,不要写任何多余的符号或说明。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package 校内选拔2015;

public class T3 {

public static void main(String[] args) {

//System.out.println(Math.pow(2.5, 2.5));
double a=2.5;

double c=0;

while(Math.abs(c-10)>0.000001){
c=Math.pow(a, a);
//System.out.println(c+" "+a);
a=a+0.0000001;
}
System.out.println(a);
}
}

4、以74开头的

今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:

17126425374635

当然,如果把它倒过来,也是符合要求的。

请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。

不写代码也能推断出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
由题目要求可知要填的数为:74 _ _ _ _ 4 _ 7 _ _ _ _ _ 
因为5和6之间分别要有5个、6个不同的数,所以5和6肯定都是在4 _ 7两边。

列出6可能的排列情况如下:
74 _ _ _ 64 _ 7 _ _ _ 6 _
74 _ _ 6 _ 4 _ 7 _ _ 6 _
74 _ 6 _ _ 4 _ 7 _ 6 _ _
746 _ _ _ 4 _ 7 6 _ _ _ _
列出5可能的排列情况如下:
74 _ _ _ 54 _ 7 _ 5 _
74 _ _ 5 _ 4 _ 7 _ 5 _ _ _
74 _ 5 _ _ 4 _ 7 5 _ _ _ _
根据6和5的排列情况再对1,2,3进行排列,最后得出的结果是74151643752362

5、勾股定理

勾股定理,西方称为毕达哥拉斯定理,它所对应的三角形现在称为:直角三角形。

已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数。

求满足这个条件的不同直角三角形的个数。

【数据格式】
输入一个整数 n (0<n<10000000) 表示直角三角形斜边的长度。
要求输出一个整数,表示满足条件的直角三角形个数。

例如,输入:
5
程序应该输出:
1

再例如,输入:
100
程序应该输出:
2

再例如,输入:
3
程序应该输出:
0

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package 校内选拔2015;

import java.util.Scanner;

public class T5 {

public static void main(String[] args) {

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
long nn=n*n;
long a=0,c=0;
long count=0;

for (int i = 1; i < n; i++) {
a=nn-i*i;
c=(long)Math.pow(a, 0.5);
if(c*c==a){
//System.out.println(n+" "+i+" "+c);
count++;
}
}
System.out.println(count/2);
}
}

8、标题:分机号

X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位。比如:

751,520,321 都满足要求,而,
766,918,201 就不符合要求。

现在请你计算一下,按照这样的规定,一共有多少个可用的3位分机号码?

请直接提交该数字,不要填写任何多余的内容。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package 校内选拔2015;

public class T8 {

public static void main(String[] args) {
int count=0;
for (int i = 0; i < 10; i++) {
for (int j = i+1; j < 10; j++) {
for (int h = j+1; h < 10; h++) {
//System.out.println(i+""+j+h);
count++;
}
}
}
System.out.println(count);
}
}

9、标题:五星填数

如【图1.png】的五星图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。


如图就是恰当的填法。

请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。

请提交表示方案数目的整数,不要填写任何其它内容。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package 校内选拔2015;

public class T9 {

static int count=0;
public static void main(String[] args) {

int[] data=new int[]{1,2,3,4,5,6,8,9,10,12};

f(data,0);
System.out.println(count/10);
}

private static void f(int[] data, int k) {

if(k==9){

if(check(data)){
count++;
}
}


for (int i = k; i < data.length; i++) {
{int t=data[k];data[k]=data[i];data[i]=t;};
f(data,k+1);
{int t=data[k];data[k]=data[i];data[i]=t;};
}
}

private static boolean check(int[] data) {

int n=data[0]+data[1]+data[2]+data[3];

if(n!=data[0]+data[4]+data[5]+data[6])
return false;

if(n!=data[7]+data[1]+data[4]+data[8])
return false;

if(n!=data[7]+data[2]+data[9]+data[6])
return false;

if(n!=data[3]+data[9]+data[5]+data[8])
return false;


return true;
}
}