面试中有可能遇到的算法题--Java算法
最近别人都问我是不是发神经,怎么突然离职了。我也只是呵呵一笑,不以为然。程序猿离职无需理由,做了两年6个月还没有跳过槽就更神奇了。
这个只有程序猿才知道。
好了,废话少说。
最近面试中遇到了一些Jave算法的题目,跟各位分享分享,毕竟你也有可能遇到,这个比在街上遇到郭敬明跟姚明走在一起(还手牵手)的机会更大。
题目1:
消息加密问题。给定一个长度为N字符串Msg,为了方便在网上传输而不被人截获,用一个长度为N的整数数组Key去加密,加密过程如下:Msg中第i(从0开始计数)个字符新的位置应该是Key[i]。同时给定一个整数count,表示整个加密将持续count次。求加密过后的字符串。
测试用例
0)
"abc"
{1,2,0}
1
Returns:"cab"
1)
"abcde"
{4, 3, 2,1, 0}
1
Returns:"edcba"
2)
"abcde"
{4, 3, 2,1, 0}
2
Returns:"abcde"
个人做法:
private static String encryptStr1(String msg, int key[]) {
String result = "";
char[] arr = msg.toCharArray();
for (int j = 0; j < key.length; j++) {
result = result + arr[key[j]];
}
return result;
}
private static String encryptStr(String msg, int key[], int count) {
String result = "";
String temp = "";
for (int i = 0; i < count; i++) {
if (i == 0) {
result = encryptStr1(msg, key);
temp = result;
} else {
result = encryptStr1(temp, key);
temp = result;
}
}
return result;
}
public static void main(String[] args) {
// write your code here
String msg = "abcd";
int count = 3;
int key[] = new int[]{2, 3, 1, 0};
String result = encryptStr(msg, key, count);
System.out.println(msg + " ====> 加密后的结果是 = " + result);
}
题目2:
给定一个由0-9纯数字组成的字符串,假设字符串的向量是由所有数字的乘积组成,字符串的标量是由所有数字的累加和组成。比如”12340”的向量是1*2*3*4*0=0,标量是1+2+3+4+0=10; ”456”的向量是4*5*6=120,标量是4+5+6=15; 现给定一个字符串数组,请按字符串的向量降序排序,如果向量一样大,则按标量降序排序,如果还一样大,则保持原来的顺序。
测试样例1:输入是{“1230”, “304”}, 程序输出{“304”, “1230”};
测试样例2:输入是{“38”, “46”, “47”}, 程序输出{“47”, “38”, “46};
个人做法:
private static int calVector(String value) {
int result = 1;
char arr[] = value.toCharArray();
for (int i = 0; i < arr.length; i++) {
char c = arr[i];
int val = Integer.parseInt(c + "");
result = result * val;
}
// System.out.println("向量值是 = " + result);
return result;
}
private static int calScalar(String value) {
int result = 0;
char arr[] = value.toCharArray();
for (int i = 0; i < arr.length; i++) {
char c = arr[i];
int val = Integer.parseInt(c + "");
result = result + val;
}
// System.out.println("标量值是 = " + result);
return result;
}
private static String compareValues(String value1, String value2) {
String result = "";
int vectorVal1 = calVector(value1);
int scalarVal1 = calScalar(value1);
int vectorVal2 = calVector(value2);
int scalarVal2 = calScalar(value2);
if (vectorVal1 == vectorVal2 && scalarVal1 == scalarVal2) {
result = value1;
} else {
if (vectorVal2 > vectorVal1) {
result = value2;
} else {
if (scalarVal2 > scalarVal1) {
result = value2;
} else {
result = value1;
}
}
}
return result;
}
public static void main(String[] args) {
// write your code here
String arr[] = {"38", "46", "47", "49"};
for (int i = 0; i < arr.length; i++) {
String maxStr = arr[i];
int n = i; // 最大数的索引
for (int j = i + 1; j < arr.length; j++) {
if (!compareValues(maxStr, arr[j]).equals(maxStr)) {
maxStr = arr[j];
n = j;
}
}
arr[n] = arr[i];
arr[i] = maxStr;
}
System.out.println("排序之后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
做是做出来了,不过感觉自己的算法水平真的一般,如果还有更好的做法,请务必分享出来让大家互相学习。
看来自己也要好好学习一下算法的知识了,后续文章如果有更好的题目我也会分享出来让大家知道,谢谢啦~