网易笔试题两道

赶去公司

终于到周末啦!小易走在市区的街道上准备找朋友聚会,突然服务器发来警报,小易需要立即回公司修复这个紧急bug。假设市区是一个无限大的区域,每条街道假设坐标是(X,Y),小易当前在(0,0)街道,办公室在(gx,gy)街道上。小易周围有多个出租车打车点,小易赶去办公室有两种选择,一种就是走路去公司,另外一种就是走到一个出租车打车点,然后从打车点的位置坐出租车去公司。每次移动到相邻的街道(横向或者纵向)走路将会花费walkTime时间,打车将花费taxiTime时间。小易需要尽快赶到公司去,现在小易想知道他最快需要花费多少时间去公司。

思路

各算各的即可求解

代码

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
public class First {
public static void main(String [] arg)
{
Scanner scanner = new Scanner( System.in);
int a = scanner.nextInt();
int x[] = new int[a];
int y[] = new int[a];
int i=0,j=0;
while (i<a)
{
x[i++]=scanner.nextInt();
}
while (j<a)
{
y[j++]=scanner.nextInt();
}
int gx = scanner.nextInt();
int gy = scanner.nextInt();
int wt = scanner.nextInt();
int tt = scanner.nextInt();
System.out.println(solution(x, y, gx, gy, wt, tt));
}
static public int solution(int x[] ,int y [] , int gx,int gy,int walktime,int taxitime)
{
int all = Math.abs(gx*walktime)+Math.abs(gy*walktime);
int []time = new int[x.length];
for ( int i = 0 ; i <x.length;i++)
{
int wt= Math.abs(x[i]*walktime) +Math.abs(y[i]*walktime);
int tt = Math.abs(gx-x[i])*taxitime+Math.abs(gy-y[i])*taxitime;
time[i]=wt+tt;
}
Arrays.sort(time);
if (time[0]<all)
return time[0];
return all;
}
}

调整队形

在幼儿园有n个小朋友排列为一个队伍,从左到右一个挨着一个编号为(0~n-1)。其中有一些是男生,有一些是女生,男生用’B’表示,女生用’G’表示。小朋友们都很顽皮,当一个男生挨着的是女生的时候就会发生矛盾。作为幼儿园的老师,你需要让男生挨着女生或者女生挨着男生的情况最少。你只能在原队形上进行调整,每次调整只能让相邻的两个小朋友交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:
GGBBG -> GGBGB -> GGGBB
这样就使之前的两处男女相邻变为一处相邻,需要调整队形2次

思路

有两种排序方式男孩在前,或者女孩在前,我们可以计算一下,他们的移动次数

代码

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
93
94
95
96
97
98
99
public class Two {
public static void main(String [] arg)
{
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String a = scanner.next();
System.out.println(solution1(a));
}
}
static public int solution(String a)
{
int test= 0 ,test1=0;
char[] c=a.toCharArray();
char[] c1 =a.toCharArray();
for ( int i=0;i<c.length;i++)
for (int j = 0 ;j<c.length-1;j++)
{
if (c[j]=='B'&&c[j+1]=='G')
{
char x= c[j];
c[j]=c[j+1];
c[j+1]=x;
test++;
}
}
System.out.println(Arrays.toString(c));
for ( int i=0;i<c1.length;i++)
for (int j = 0 ;j<c1.length-1;j++)
{
if (c1[j]=='G'&&c1[j+1]=='B')
{
char x= c1[j];
c1[j]=c1[j+1];
c1[j+1]=x;
test1++;
}
}
System.out.println(Arrays.toString(c1));
if (test<test1)
return test;
else
return test1;
}
static public int solution1(String a)
{
char[] c =a.toCharArray();
int left=0,left1=0;
int right=0,right1=0;
for (int i =0;i<c.length;i++)
{
if (c[i]=='G')
left++;
else
left1+=left;
}
for (int i =0;i<c.length;i++)
{
if (c[i]=='B')
right++;
else
right1+=right;
}
return left1>right1?right1:left1;
}
static public int solution1(String a)
{
char[] c =a.toCharArray();
int left=0,left1=0;
int right=0,right1=0;
/*
比如说GGGBG
下面是将B放在前面,然后我们不用排序,因为B前面有3个G
所以就需要向前三次
*/
for (int i =0;i<c.length;i++)
{
if (c[i]=='G')
left++; //记录前面有多少个G
else //出现了B,那么将这个B转移到前面就需要
left1+=left; //这么多次操作
}
// 类似的;
// 比如说BGBGBG;
// 第一个G前面有一个B,移动一次
// 第二个G前面有两个B,就需要移动两次
for (int i =0;i<c.length;i++)
{
if (c[i]=='B')
right++;
else
right1+=right;
}
return left1>right1?right1:left1; //比较一下那种移动次数少,就返回喽
}
}

收获

  1. 在第二题的时候,冒泡写错了;基础知识不扎实啊!
  2. 题还是挺简单的,认真做,想办法用简单的办法做出来;