1.原地翻转字符串
第一题:翻转字符串 (空间复杂度O(1))
先将I am a students.翻转.tneduts a ma I,然后空格分隔,并将每个字串各自翻转
翻转使用双指针去交换左右两边。
I am a student.翻转成student. a am I
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
char[] chs = s.toCharArray();
swap(chs, 0,s.length() - 1);
String reverse = String.valueOf(chs);
StringBuilder sb = new StringBuilder();
String[] sArray = reverse.split(" ");
for (int i = 0; i < sArray.length; i++) {
char[] chars = sArray[i].toCharArray();
swap(chars, 0, chars.length - 1);
sb.append(chars);
sb.append(" ".toCharArray());
}
System.out.println(sb.toString().trim());
}
public static void swap(char[] chs, int left, int right) {
while (left < right) {
char tmp = chs[left];
chs[left] = chs[right];
chs[right] = tmp;
left++;
right--;
}
}
2.字符数组中两个字符串加起来最小
第二题:和题字符串拼接最小字典序相似,输入多个字符串然后可以依次组合,输出组合最小的字符串(因为之前听过左神的课,知道了此用法)
思路:贪心的思路!重写比较器,比较两种相加情况,两个字符串加起来(可以有两种不同的相加情况:a + b和b + a),哪一个作为前缀结果小那么就将哪一个排在前面,例如:如果(a + b) >(b + a) 那么b放在前面。
这样将每次排在最前面的拿出来拼接,那么结果就最小。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String data = sc.next();
String[] dataArray = data.split(",");
if (dataArray == null) System.out.println(data);
PriorityQueue<String> pQ = new PriorityQueue<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (Long.valueOf(o1 + o2) > Long.valueOf(o2 + o1)) {
return 1;
} else if (Long.valueOf(o1 + o2) == Long.valueOf(o2 + o1)) {
return 0;
} else {
return -1;
}
}
});
for (String s : dataArray) {
s = s.trim();
pQ.add(s);
}
StringBuilder sb = new StringBuilder();
while (!pQ.isEmpty()) {
sb.append(pQ.poll());
}
System.out.println(sb.toString());
}
第三题:背包问题
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int[] weight = new int[N];
int[] value = new int[N];
for (int i = 0; i < N; i++) {
weight[i] = sc.nextInt();
}
for (int i = 0; i < N; i++) {
value[i] = sc.nextInt();
}
int [][]dp=new int[N+1][M+1];
for(int i=1; i<=N; i++) {
int w=weight[i-1];
int v=value[i-1];
for(int j=1;j<=M;j++) {
if(j>=w) {
dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-w]+v);
}else {
dp[i][j]=dp[i-1][j];
}
}
}
System.out.println(dp[N][M]);
}