b场景算法题(Java实现)
<一>、字母倒着输出
题目描述:
给定一组字符串,然这组字符串中的字母按照倒着的顺序输出,空格保留。
例如:
输入:
i am a student
输出:
student am i
代码如下:
import java.util.Scanner; public class Main4 { public static void main(String[] args) { Scanner in = new Scanner(System.in); String str = in.nextLine(); String[] strs = str.split(" "); StringBuffer sb = new StringBuffer(); for(int i = strs.length - 1;i >= 0;i--) { sb = sb.append(strs[i]).append(" "); } System.out.println(sb.toString()); } }
<二>寻找最小数的字串
题目描述:
给定一组数组,用逗号分隔,求得到这组数组中数组成的最小数字。
例如:
输入:
21,321
输出;
21321
代码如下:
package com.ymm.core.b;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
String[] strs = str.split(",");
printNum(strs);
}
private static void printNum(String[] strs) {
ArrayList<String> list = new ArrayList<>();
for(String s : strs) {
list.add(s);
}
Collections.sort(list,new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
String str1 = s1 + s2;
String str2 = s2 + s1;
return str1.compareTo(str2);
}
});
StringBuffer sb = new StringBuffer();
for(String j : list) {
sb.append(j);
}
System.out.println(sb.toString());
}
}
<三>背包问题
题目描述
有为N件物品,它们的重量w分别是w1,w..,wn,它们的价值v分别是1.,.....,每件物品数量有且仅有一个, 现在给你个承重为M的背包,求背包里装入的物品具有的价值最大总和?
输入描述:
物品数量N=5件
重量W分别为:2 2 6 5 4
物品价值为:3 6 9 5 6
背包数量为:10
输出描述:
最大价值为:18
代码如下:
package com.ymm.core.b; import java.util.Scanner; public class Main1 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); //物品的数量 int W = in.nextInt(); //背包的容量 int[] weight = new int[N + 1];//物品的重量 int[] value = new int[N + 1];//物品的价值 for(int i = 1;i <= N;i++) { weight[i] = in.nextInt(); } for(int i = 1;i <= N;i++) { value[i] = in.nextInt(); } int[][] maxVal = new int[N + 1][W + 1]; // 最大价值 int[] a = new int[N + 1];//判断 for(int i =1;i <= W;i++) { for(int j = 1;j <= N;j++) { if(i >= weight[j]) { //f[i][j] = max(f[i-1][j], f[i-1][j-Vi] + Wi) //Vi表示第i件物体的体积,Wi表示第i件物品的价值。这样f[i-1][j]代表的就是不将这件物品放入背包 //而f[i-1][j-Vi] + Wi则是代表将第i件放入背包之后的总价值,比较两者的价值, //得出最大的价值存入现在的背包之中 maxVal[j][i] = Math.max(maxVal[j - 1][i - weight[j]] + value[j], maxVal[j - 1][i]); }else{ //前j个物体 maxVal[j][i] = maxVal[j - 1][i]; } } } int n = W; for(int i = N;i > 0;i--) { if(maxVal[i][n] == maxVal[i - 1][n]) { a[i] = 0; }else { a[i] = 1; n = n - weight[i]; } } System.out.println("取得最大价值:" + maxVal[N][W]); } }