题目来源于:卡码网KamaCoder
题解来源于:GitHub - youngyangyang04/kamacoder-solutions: 卡码网题解全集
目录
题目描述
假设你正在编写一个简单的 Unix 命令行模拟器,用户可以使用该模拟器来导航文件系统。用户可以输入 cd 命令来更改当前工作目录,并使用 pwd 命令来查看当前工作目录的路径。
但是,用户可能会输入复杂的路径,包括"/../"、"//"、"/./"或者多个连续的"/"等冗余部分,这会导致路径不太直观和容易理解。因此,你需要实现一个简化路径的功能,以确保路径始终保持干净、规范化和易于理解。
每次的 cd 命令都在根目录下进行执行。
输入
输入包含多组测试数据,每组测试数据有一个字符串,表示用户命令。
输出
输出简化后的路径,且路径不能以 "/" 结尾。
样例输入
cd /a/./b/../../c/
cd /abc/def/ghi//jkl/./mno/../pqr/
样例输出
/c
/abc/def/ghi/jkl/pqr
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;
/**
* @author light
* @Description 路径简化
(思路:利用双端队列,首先将字符串以“/”分隔,遍历后的字符串:
* 若遇到字母,则加入队列
* 若遇到“..”且队列不为空,则将队头元素出队列----对应着返回上级目录
* 遇到“.”不用管---对应当前目录
* 最后将队列元素与“/”拼接
* @create 2023-09-07 19:00
*/
public class Main {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String s;
//s=s.substring(4);
//System.out.println(simplify(s));
while(input.hasNextLine()){
s=input.nextLine();
s=s.substring(3);
System.out.println(simplify(s));
}
}
private static String simplify(String s) {
Deque<String> que=new ArrayDeque<>();
for (String i :s.split("/")) {
if(i.equals("..")&&!que.isEmpty()){
que.removeLast(); //返回上层目录
} else if (!i.equals("..")&&!i.equals(".")&&!i.equals("")) {
que.add(i);
}
}
StringBuilder sb=new StringBuilder();
while (!que.isEmpty()&&que.peek()!=""){
sb.append("/");
sb.append(que.removeFirst());
}
return sb.toString().length()==0?"/":sb.toString();
}
}
汽水瓶子换饮料
题目描述
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(只能借一个,必须要归还)。
小张手上有 n 个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
输入
输入文件包含多组测试数据,每个数据占一行,仅包含一个正整数 n ,表示小张手上的空汽水瓶数。n = 0 表示输入结束。
输出
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出 0。
样例输入
3
10
81
0
样例输出
1
5
40
import java.util.Scanner;
/**
* @author light
* @Description 汽水瓶换饮料
*
* (思路:递归
* f(1)=0;
* f(2)=1;
* f(3)=1;
* f(4)=f(2)+1;---四个瓶子,可以用三个空瓶子换一瓶汽水,喝完后问老板借一个空瓶子,则一共可以兑换两个空瓶子
* f(n)=f(n-2)+1;
* @create 2023-09-07 19:05
*/
public class n14 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n;
while((n=input.nextInt())!=0){
System.out.println(change(n));
}
}
private static int change(int n) {
if(n==1){
return 0;
}
if(n==2){
return 1;
}
return change(n-2)+1;
}
}
开发商购买土地
题目描述
在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。
现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。
然而,由于城市规划的限制,只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。 为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。
注意:区块不可再分。
输入
第一行输入两个正整数,代表 n 和 m。
接下来的 n 行,每行输出 m 个正整数。
输出
请输出一个整数,代表两个子区域内土地总价值之间的最小差距。
样例输入
3 3
1 2 3
2 1 3
1 2 3
样例输出
0
import java.util.Scanner;
/**
* @author light
* @Description 开发商购买土地
*
* (思路:直接暴力模拟每一次分隔,记录最小差值
* @create 2023-09-07 19:37
*/
public class n16 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt(); //n行
int m=input.nextInt(); //m列
int[][] land=new int[n][m];
int sum=0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
land[i][j]=input.nextInt();
sum+=land[i][j];
}
}
System.out.println(getMinDiff(land, n, m, sum));
}
private static int getMinDiff(int[][] land,int n,int m,int sum) {
int aArea=0;
int bArea;
int diff;
int result=Integer.MAX_VALUE;
for (int i = 0; i < n-1; i++) { //画横线
for (int j = 0; j < m; j++) {
aArea+=land[i][j]; //a价值
}
bArea=sum-aArea; //b价值
diff=bArea-aArea; //ab总价值差
result=Math.min(result,Math.abs(diff));
}
aArea=0;
for (int j = 0; j < m-1; j++) {
for (int i = 0; i < n; i++) {
aArea+=land[i][j];
}
bArea=sum-aArea; //b价值
diff=bArea-aArea; //ab总价值差
result=Math.min(result,Math.abs(diff));
}
return result;
}
}