题目来源于:卡码网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;}
}