面试中有可能遇到的算法题--Java算法

来源:互联网 发布:sql语句别名 编辑:程序博客网 时间:2024/04/27 19:46

面试中有可能遇到的算法题--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] + " ");        }    }


做是做出来了,不过感觉自己的算法水平真的一般,如果还有更好的做法,请务必分享出来让大家互相学习。


看来自己也要好好学习一下算法的知识了,后续文章如果有更好的题目我也会分享出来让大家知道,谢谢啦~










0 0