首页 > 试题广场 >

编码

[编程题]编码
  • 热度指数:19428 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。 编写一个函数,输入是任意一个编码,输出这个编码对应的Index.

输入描述:
输入一个待编码的字符串,字符串长度小于等于100.


输出描述:
输出这个编码的index
示例1

输入

baca

输出

16331
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        int result = 0;
        for (int i = 0; i < s.length(); i++) { //计算数目
            int k = s.charAt(i) - 'a' + 1;
            switch (i) {
                case 0:
                    result += (26 * 25 * 25 + 25) * (k - 1) + k;
                    break;
                case 1:
                    result += 26 * 25 * (k - 1) + k;
                    break;
                case 2:
                    result += 25 * (k - 1) + k;
                    break;
                case 3:
                    result += k;
                    break;
            }
                
            
        }
        System.out.println(result - 1);
    }
}
发表于 2022-03-03 22:19:07 回复(0)



import java.util.Scanner;

public class Main{
	static final int SIZE = 4;
    public static void main(String[]  args){
        Scanner input = new Scanner(System.in);
        String str = input.next();
        input.close();
        if(str.length() > SIZE)
        	System.out.println(-1);
        else
        	System.out.println(Solution(str ,SIZE));
    }
    public static int Solution(String s, int size) {
		if(size == 1) {
			int f = s.charAt(0) - 'a';
	        return f;
		}else if(s.length() == size){
			int f = s.charAt(0) - 'a';
			String str = "";
			for(int i = 0 ; i < size - 1; i++)
				str += "y";
			return f*(2 + Solution(str, size - 1)) + Solution(s.substring(1, size), size-1) + 1;
		}else {
			if(!s.equals("a")){
				if(s.charAt(s.length()-1) == 'a') {
					return 1 + Solution(s.substring(0, s.length()-1), SIZE);
				}else {
					String str = "";
					str += s.substring(0, s.length()-1);
					str += (char)(s.charAt(s.length()-1) - 1);
					for(int i = 0; i < SIZE - s.length(); i++)
						str += "y";
					return 1 + Solution(str, SIZE);
				}
			}else {
				return 0;
			}
		}
    }
}


编辑于 2019-09-08 13:53:35 回复(0)

public class Main {

    public static void main(String[] args) {
        System.out.println(bm("baca"));

    }

    private static Integer bm(String str) {
        int len = str.length();
        char[] ch = str.toCharArray();
        int sum = 0;
        if (len > 4) {
            System.out.println("输入字符串超过4");
            return null;
        } else if (!str.matches("^[a-z]+$")) {
            System.out.println("不符合要求的格式");
        } else {
            for (int i = 0; i < len; i++) {
                for (int j = 3 - i; j >= 0; j--) {
                    sum += (ch[i] - 'a') * Math.pow(25, j);
                }
                sum++;
            }
        }
        return sum - 1;
    }

}
 
发表于 2019-01-06 00:04:54 回复(0)
public class Main{

    
    public static void main(String[] args) {
        
        
        Scanner scan=new Scanner(System.in);
        String n = scan.next();
        int len = n.length();
        char[] ch = n.toCharArray();
        long con=0;    
        int[] f={25*25*25+25*25+25+1,25*25+25+1,26,1};
        for (int i = 0; i < len; i++) {
            con+=f[i]*(ch[i]-'a')+1;

        }
        if (ch[0]!='a') {
            con-=1;
        }
        System.out.println(con);

    }
}

发表于 2018-10-02 13:49:42 回复(0)
//这是一个25进制的编码,每个字符在其位置上都是有权值的,找出权值就好,对比10进制之类的

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        //定义编码权值数组
        int[]  dp={1+25*25*25+25*25+25,1+25*25+25,1+25,1};
        Scanner sc=new Scanner(System.in);
        String str=sc.nextLine();
       //根据公式 index=str.length-1+sum{dp[i] * (string[i] - 'a')}   i的范围为0到str.length-1
        
        int len=str.length();
        int index=len-1;
        for(int i=0;i<len;i++){
            index+=dp[i]*(str.charAt(i)-'a');
            
        }
        
       System.out.println(index);
         
        
   }
    
    
    
}
发表于 2018-08-29 19:24:54 回复(0)
傻瓜方案 硬数 并且根据每个输入位判断

/**
 * @author Administrator
 */

import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String input = sc.next();
            List<Character> temp = new ArrayList();
            for (int i = 0; i < 4; i++) {
                if (i < input.length()) {
                    temp.add(input.charAt(i));
                } else {
                //输入不足4位用‘·’补齐 因为这个符号的ascii值是96 方便计算
                    temp.add('`');
                }
            }
            //记录当前位的索引值
            int index = 0;
            //用来判断当前位是否是补足位之后,若是就结束计算,否则进入判断条件
            int stop = 0;
            //当前位与第1位的差值
            int flag0 = 0;
             //当前位与第2位的差值
            int flag1 = 0;
             //当前位与第3位的差值
            int flag2 = 0;
             //当前位与第4位的差值
            int flag3 = 0;
            //如果第一位是a 索引值加1,否则根据差值计算,差值每加1,计算出来索引增加16276
            //就是硬数出来的,没有原因
            if (temp.get(0) == 'a') {
                index = 1;
            } else {
                flag0 = temp.get(0) - 97;
                index = flag0 * 26 * 25 * 25 + 25*flag0 + flag0;
            }
            //第2位是补足位,直接输出index,stop置1
            if (temp.get(1) == '`') {
                System.out.println(index);
                stop = 1;
            //第2位是a,索引加1
            } else if (temp.get(1) == 'a') {
                index++;
            //第2位是其他字符,根据差值计算,也是硬数的,不漏情况就行了
            } else {
                flag1 = temp.get(1) - 97;
                index = index + flag1 * (25 * 26 + 1)+1;
            }
            //考虑第3位是否位于补足位之后,是就不进判断了,否则类似第二位的思路考虑
            if (stop == 0 && temp.get(2) == '`') {
                System.out.println(index);
                stop = 1;
            } else if (stop == 0 && temp.get(2) == 'a') {
                index++;
            } else if (stop == 0 && temp.get(2) - 97 > 0) {
                flag2 = temp.get(2) - 97;
                index = index + flag2 * 26 + 1;
            }
            //第4位基本与第三位相同
            if (stop == 0 && temp.get(3) == '`') {
                System.out.println(index);
                stop = 1;
            } else if (stop == 0 && temp.get(3) == 'a') {
                index++;
                System.out.println(index);
            } else if (stop == 0 && temp.get(3) - 97 > 0) {
                flag3 = temp.get(3) - 97;
                index = index + flag3 + 1;
                System.out.println(index);
            }
        }
    }
}

发表于 2018-08-15 17:28:32 回复(0)
参考最高赞
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        System.out.println(encode(str));
    }
    public static int encode(String str) {
        if (str.equals("a")) {
            return 0;
        }
        if (str.equals("aa")) {
            return 1;
        }
        if (str.equals("aaa")) {
            return 2;
        }
        if (str.equals("aaaa")) {
            return 3;
        }

        int res = 0;
        int one,two,three,four;
        int mod = 25;
        one = mod * mod * mod + mod * mod + mod + 1;
        two = mod * mod + mod + 1;
        three = mod + 1;
        four = 1;
        int []arr = new int[4];
        arr[0] = one;
        arr[1] = two;
        arr[2] = three;
        arr[3] = four;

        int i = 1;
        while (i <= str.length()) {
            int cnt = Integer.parseInt(String.valueOf(str.charAt(i - 1) - 'a'));
            if (i == 1) {
                res += cnt * arr[i - 1];
            }else {
                //此处加一是因为,a = 0,aa = 1,所以除了第一位每一位都要加1
                res += cnt * arr[i - 1] + 1;
            }
            i ++;
        }
        return res;
    }
}

发表于 2018-06-05 22:04:26 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            int w = c - 'a';
            if (i == 0) {
                count += w * (25*25*25 + 25*25 + 25 + 1) + 1;
            } else if (i == 1) {
                count += w * (25*25 + 25 + 1) + 1;
            } else if (i == 2) {
                count += w * (25 + 1) + 1;
            } else {
                count += w + 1;
            }
        }
        System.out.println(count - 1);
    }
}
发表于 2018-03-18 13:45:54 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine().trim();
        System.out.println(getres(str));
    }
    
    public static int getres(String str){
        int count = 0;
        for (int i=0; i<str.length(); i++){
            int x = str.charAt(i) - 'a';
            if (i == 0){
                count += x*(25*25*25 + 25*25 + 25 + 1) + 1;
            }else if(i == 1){
                count += x*(25*25 + 25 + 1) + 1;
            }else if(i == 2){
                count += x*(25 + 1) + 1;
            }else{
                count += x + 1;
            }
        }
        return count-1;
    }
}
发表于 2018-03-04 11:29:37 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] factor = new int[] {25*25*25+25*25+25+1, 25*25+25+1, 25+1, 1};
        while (in.hasNext()) {
            String str = in.nextLine();
            int loc = str.length() - 1;
            for (int i = 0; i < str.length(); i++)
                loc += (str.charAt(i) - 'a') * factor[i];
            System.out.println(loc);
        }
    }
}

发表于 2017-12-24 16:31:15 回复(0)
import java.util.*;

public class Main {
    private static Scanner scanner = new Scanner(System.in);
    private static int[] a = {16276, 651, 26, 1};

    public static void main(String[] args){
        String line = scanner.nextLine();
        int sum = 0;
        for(int i = 0; i < line.length() && i < 4; i++)
            sum += 1 + (line.charAt(i) - 'a') * a[i];
        System.out.println(sum - 1);
    }
}
发表于 2017-09-18 11:48:16 回复(0)

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String b = in.next();
        int res = codeindex(b);
        System.out.println(res);
    }

    public static int codeindex(String code) {
        int factor[] = {1+25+25*25+25*25*25, 1+25+25*25, 1+25, 1};
        char[] codearr = code.toCharArray();
        int index = 0;
        int len = 0;
        for(int i = 0;i < codearr.length; i++){
            index += factor[len++] * (codearr[i] - 'a');
        }
        return index + (len - 1);
    }
}
发表于 2017-06-25 20:55:28 回复(0)