面接で出会う可能性のあるアルゴリズムの問題--Javaアルゴリズム
4762 ワード
面接で出会う可能性のあるアルゴリズムの問題--Javaアルゴリズム
最近、神経質なのかと聞かれたのに、どうして急に退職したのか.私もただほほほと笑って、そうは思わない.プログラム猿が退職する理由はなく、2年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"
個人的なアプローチ:
タイトル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};
個人的なアプローチ:
やったことはできましたが、自分のアルゴリズムのレベルが本当に普通だと感じています.もっと良い方法があれば、ぜひ共有してお互いに勉強させてください.
自分もアルゴリズムの知識をよく勉強しなければならないようです.後続の文章にもっと良いテーマがあれば、私も共有して皆さんに知ってもらいます.ありがとうございます.
最近、神経質なのかと聞かれたのに、どうして急に退職したのか.私もただほほほと笑って、そうは思わない.プログラム猿が退職する理由はなく、2年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] + " ");
}
}
やったことはできましたが、自分のアルゴリズムのレベルが本当に普通だと感じています.もっと良い方法があれば、ぜひ共有してお互いに勉強させてください.
自分もアルゴリズムの知識をよく勉強しなければならないようです.後続の文章にもっと良いテーマがあれば、私も共有して皆さんに知ってもらいます.ありがとうございます.