算法题应该是没有原题的,凭记忆还原个大概。
前面选择题题型:经典给几个数字找规律、数学应用题、数据结构、编译原理(我去这个考的我傻了,什么文法我还没学)、操作系统
第一题
题目:给个字符串,例如aaabb,删除其中的字符,使其不出现偶数长度的回文串,求最小操作次数。
- 输入:第一行是字符串长度,第二行是字符串
这道题我当时是没想出来的(我只能说很不应该,最近实习很久没写算法题了),暴力过了20%的用例。
- 思路:偶数回文串的必要条件是要有两个相邻字符相同,所以破坏这个必要条件就可以。
例如:aaabb,把他变成ab。
- 上代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // 字符串长度
String str = in.next();
int ans = 0;
for(int i=1; i<n ; i++){
if (str.charAt(i) == str.charAt(i-1)) ans++;
}
System.out.println(ans);
}
}
第二题
题目:给个数组,其中有的数字可以移动,有的数字不可以移动。可以移动的数字之间能够做交换操作,要求把这个数组还原成从小到大排序的样子所需要的最小操作次数。
- 输入:第一行是数组大小,第二行是数组,第三行是可不可以移动(W表示不可移动,R表示可以移动)
- 例如:
4
1 3 2 4
WRRW
-
输出:1(交换3和2即可还原)
-
思路:当时第一道题看了眼没什么想法,第二道题读了下题脑子里大概就有思路了。首先如果不可移动的数字所在的位置不正确,再怎么移动也无法还原,直接输出-1。然后对于位置不对的可以移动的数字,和这个位置本该在的数字现在在的位置交换。
可能说的比较抽象
例如:1 6 9 4 8(假设都可以移动)
6这个位置本该是4,所以他去和4交换 --> 1 4 9 6 8
9这个位置本该是6,所以他去和6交换 --> 1 4 6 9 8
9这个位置本该是8,所以他去和8交换 --> 1 4 6 8 9
所以最少需要的操作次数为3
- 上代码
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // 数组长度
int[] array = new int[n]; // 数组
int[] sortArray = new int[n]; // 排序后的数组(方便后续用于比较)
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); // k:值 v:位置
String colors = "";
for (int i=0; i<n; i++){
array[i] = in.nextInt();
sortArray[i] = array[i];
map.put(array[i], i);
}
colors = in.next();
Arrays.sort(sortArray);
int ans = 0;
for(int i=0; i<n; i++){
// 不相等的时候
if (array[i] != sortArray[i]){
if (colors.charAt(i) == 'W'){
// 无法还原
System.out.println("-1");
return;
}
else{
int pos = map.get(sortArray[i]); // 获取本该在这个位置的数字目前所在的位置
if (colors.charAt(pos) == 'W'){
// 如果这个位置无法移动, 则还是无法还原
System.out.println("-1");
return;
}
else{
ans++;
// 交换
int temp = array[pos];
array[pos] = array[i];
array[i] = temp;
// 记得map的数值也要改!忘记了这个导致我wa了几发
map.put(array[i], i);
map.put(array[pos], pos);
}
}
}
}
System.out.println(ans);
}
}