牛客网---2016---美团字符串计数

来源:互联网 发布:minecraft java 编辑:程序博客网 时间:2024/06/03 16:31

兔子今早感受到了实验室空调的寒意,舒服到爆炸,啧啧。而且,今天周五诶,周五诶,是时候去吃一波火锅了。。。


题目:
求字典序在s1和s2之间的,长度在len1到len2的字符串的个数,结果mod 1000007。
输入:
每组数据包涵s1(长度小于100),s2(长度小于100),len1(小于100000),len2(大于len1,小于100000)
输出:
输出答案。
解析:
1. 字典序:简单来讲,就是依次比字母, 如boat < boot < cap < card < cat < to < too< two < up
2. 不确定s1和s2哪一个字符串的序列大
解题所需函数:
1 . 比较字符串的大小

// 简单来讲,s1和s2比较,s1小的话输出负数,否则输出正数String s1 = "abc"; String s2 = "abcd"; String s3 = "abcdfg"; String s4 = "1bcdfg"; String s5 = "cdfg"; // -1 (前面相等,s1长度小1) System.out.println( s1.compareTo(s2) ); // -3 (前面相等,s1长度小3) System.out.println( s1.compareTo(s3) ); // 48 ("a"的ASCII码是97,"1"的的ASCII码是49,所以返回48) System.out.println( s1.compareTo(s4) ); // -2 ("a"的ASCII码是97,"c"的ASCII码是99,所以返回-2)System.out.println( s1.compareTo(s5) ); 

2 . 获取String的某个位置上的数据

// 利用charAt来获取位置,从0开始s1.charAt(0);

代码:

import java.util.*;public class Main{    public static void main(String[] args){        // 录入数据        Scanner in = new Scanner(System.in);        while(in.hasNext()){            // 用于记录结果            long result = 0;            String s1 = in.next();            String s2 = in.next();            int len1 = in.nextInt();            int len2 = in.nextInt();            // 比较字符串的大小            String temp;            if(s1.compareTo(s2)>0){                // 此刻s1比较大                temp=s1;                s1=s2;                s2=temp;            }            // 经过if判断语句之后,保证了s1位较小方            int i;            // 获取s1和s2长度的最小值和最大值            int maxlen = s1.length()>s2.length()?s1.length():s2.length();            int minlen = s1.length()<s2.length()?s1.length():s2.length();            for(i=0;i<len2;i++){                int dis;                if(i<minlen){                    dis=s2.charAt(i)-s1.charAt(i);                }else{                    dis = s2.charAt(i)-'a'+1;                }                long now=0;                int j;                for(j=len1;j<=len2;j++){                    // j-i-1 此点到判断点的距离                    if(j-i-1>=0){                        now=now+(long)Math.pow(26,j-i-1);                    }                }                now = (now*dis)%1000007;                result+=now;            }            // 减去最后一个默认重合的点            System.out.println(result-1);        }    }}

存疑:
我知道上面的方法可能很简单,但是有点难以理解,至少我是这么觉得的,因为dis=s2.charAt(i)-s1.charAt(i);的计算结果不能始终为正数,而是默认先计算了一部分,而后又减去了一部分,啧啧,有点难理解的哟。

原创粉丝点击