督促自己——某客编程题3道(Java)——字符串查找、数组、集合

督促自己——某客编程题3道(Java)——字符串查找、数组、集合

第一题:
题目描述
一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。
给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。
本题含有多组样例输入。
输入描述:
输入一个string型基因序列,和int型子串的长度
输出描述:
找出GC比例最高的子串,如果有多个输出第一个的子串
示例1
输入
AACTGTGCACGACCTGA
5
输出
GCACG
基本思路:通过截取指定长度的子串,然后在子串中记录C或G的出现次数,找到次数最多的子串就是最终答案了。

import java.util.*;
public class Main{
    
    
    public static void main(String[]args){
    
    
        Scanner input=new Scanner(System.in);
        while(input.hasNext()){
    
    
            String str=input.next();
            int n=input.nextInt();
            int maxIndex=0;
            int count=0;
            for(int i=0;i<str.length()-n;++i){
    
    
                String ss=str.substring(i,i+n);
                int cg=0;
                for(int j=0;j<n;++j){
    
    
                    if(ss.charAt(j)=='C'||ss.charAt(j)=='G'){
    
    
                        cg++;
                    }
                }
                if(cg>count){
    
    
                    maxIndex=i;
                   count=cg;
                }
            }
            System.out.println(str.substring(maxIndex,maxIndex+n));
        }
    }
}

第二题:
题目描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
本题含有多组输入数据!
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入
abcdefghijklmnop
abcsafjklmnopqrstuvw
输出
jklmnop
基本思路:依次截取最短字符串,利用String类中的contains方法在最长字符串中查找这个子串,找到最长子串,并记录位置即可。由于字符串一和二都有可能是最短的,所以为了减少代码的重复率,我将其写为方法,方法内默认第一个参数字符串为最短字符串。

import java.util.*;
public class Main{
    
    
    public static void main(String[]args){
    
    
        Scanner input=new Scanner(System.in);
        while(input.hasNext()){
    
    
            String s1=input.nextLine();
            String s2=input.nextLine();
            int[]num=new int[2];
           if(s1.length()<s2.length()){
    
    
               num=lengthed(s1,s2);
               System.out.println(s1.substring(num[0],num[1]+1));
           }else{
    
    
                num=lengthed(s2,s1);
               System.out.println(s2.substring(num[0],num[1]+1));
           }
        }
    }
    public static int[] lengthed(String str1,String str2){
    
    
        int start=0;
        int end=0;
        int slen=str1.length();
       for(int i=0;i<slen;++i){
    
    
           for(int j=i;j<slen;++j){
    
    
               String ss=str1.substring(i,j+1);
               if(str2.contains(ss)&&ss.length()>end-start+1){
    
    
                   start=i;
                   end=j;
               }
           }
       }
        return new int[]{
    
    start,end};
    }
}

第三题:
题目描述
MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌。
现在要实现通过上下键控制光标移动来浏览歌曲列表,控制逻辑如下:
歌曲总数<=4的时候,不需要翻页,只是挪动光标位置。
光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。
在这里插入图片描述
输入描述:
输入说明:
1 输入歌曲数量
2 输入命令 U或者D
本题含有多组输入数据!
输出描述:
输出说明
1 输出当前列表
2 输出当前选中歌曲
示例1
输入
10
UUUU
输出
7 8 9 10
7
基本思路:利用数组的随机访问的性质,由于每页的歌曲数是确定的,都是4,那么我只需要用left和right两个变量记录每页的的一个歌曲下标与最后一个歌曲的下标,若当前光标(代码中的index)不在这页中就翻页(对left(right)加加或减减),最终left、right、index中就是最终结果。

import java.util.*;
public class Main{
    
    
    public static void main(String[]args){
    
    
        Scanner input=new Scanner(System.in);
        while(input.hasNext()){
    
    
            int len=input.nextInt();
            String str=input.next();
            int[]num=new int[len+1];
            for(int i=1;i<num.length;++i){
    
    
                num[i]=i;
            }
            int index=1;
            int left=1;
            int right=4;
            for(int i=0;i<str.length();++i){
    
    
                if(str.charAt(i)=='U'){
    
    
                    if(index==1){
    
    
                        index=num.length-1;
                        left=num.length-4;
                        right=num.length-1;
                    }else{
    
    
                        index--;
                        if(index<left){
    
    
                        left--;
                        right--;
                        }
                    }
                }else{
    
    
                    if(index==num.length-1){
    
    
                        index=1;
                        left=1;
                        right=4;
                    }else{
    
    
                        index++;
                        if(index>right){
    
    
                        left++;
                        right++;
                        }
                    }
                }
            }
            for(int i=left;i<=right;++i){
    
    
                if(i>0){
    
    
                    System.out.print(i+" ");
                }
            }
            System.out.println();
            System.out.println(index);
        }
    }
}

加油!!!!!!!!!!

猜你喜欢

转载自blog.csdn.net/qq_45841205/article/details/115257022
今日推荐