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

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


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


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










你可能感兴趣的:(Java算法学习,Java,Android)