KamaCoder(四)

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

你可能感兴趣的:(做题总结,java)