日期:2014-05-20  浏览次数:20866 次

算法问题(java版)
String code="757365726e616d653d74657374267369676e3d39363337316431323365333366626263333339356361623839653636346161392673657276657269703d3132372e302e302e3126736572766572706f72743d383538266e7063646f776e6c6f616475726c3d687474703a2f2f3132372e302e302e313a38303831";
String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
char[] chs = new char[code.length()];
for (int i = 0; i < code.length(); i++) {
 
int addx = i % 62;
int c = code.charAt(i);
int dx = chars.indexOf(c);
dx += addx;
dx %= 62;
chs[i] = chars.charAt(dx);
}
ret = new String(chs);
System.out.println(ret+" len:"+ret.length());
} catch (Exception ex) {
ex.printStackTrace();
}
out: ret=7696AAD9EnGCIqKKJuPNQQTQVTSXZWaeceeDdEfmhljklqnmsrrqttvw00z0126785A7CABCDEFMHKMKOKQNPVRYWWVZXbZbeagcfmglnkoornttuuxty21vza10335A6j97AnDBErHGINPMQQTPVVWWZVbVcCfbhffGhnjmlrmrsRvpwuyx0a344d6d8iA6CBFEHDIpHsMPPNRPTNRzS6U8XWZZbgcFfdgJjhkNnmpNrxtrv1xw

求解密 算法 谢谢大牛 能来解答

------解决方案--------------------
帮顶 不解释……
------解决方案--------------------
这个很好算啊,反过来算就可以了
for example

Java code
public class Test {
    public static void main(String[] args) throws Throwable {
        String code="757365726e616d653d74657374267369676e3d39363337316431323365333366626263333339356361623839653636346161392673657276657269703d3132372e302e302e3126736572766572706f72743d383538266e7063646f776e6c6f616475726c3d687474703a2f2f3132372e302e302e313a38303831";
        
        System.out.println("------decode------");
        String ret = encode(code); //加密
        System.out.println(ret);

        System.out.println("------decode------");
        ret = decode(ret); //解密
        System.out.println(ret);

        System.out.println(code.equals(ret)); //测试加密解密后是否和原数据一致
    }

    public static String encode(String code) { //加密算法,就是LZ的代码抽出来做个方法
        String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        char[] chs = new char[code.length()];
        for (int i = 0; i < code.length(); i++) {
            int addx = i % 62;
            int c = code.charAt(i);
            int dx = chars.indexOf(c);
            dx += addx;
            dx %= 62;
            chs[i] = chars.charAt(dx);
        }
        return new String(chs);
    }

    public static String decode(String code) { //解密算法,就是加密反过来
        String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        char[] chs = new char[code.length()];
        for (int i = 0; i < code.length(); i++) {
            int addx = i % 62;
            int c = code.charAt(i);
            int dx = chars.indexOf(c);
            dx -= addx;
            if (dx < 0) dx += 62;
            chs[i] = chars.charAt(dx);
        }
        return new String(chs);
    }
}

------解决方案--------------------
code是源字符串,其中的每个字符,查表决定其对应的目标字符。

查表规则如下:
每个字符,如果在源字符串中是第i个字符,则在码表中找该字符后第i个位置上的目标字符作为替换。
每个源字符对应一个目标字符。

如,第一个字符是7,所以找7后面的第0个字符,就是7自己。
第二个字符是5,所以找5后面的第1个字符,是6。
第3个字符是7,所以找7后面的第2个字符,是9
...