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

本文介绍了三道某客编程题目,分别涉及DNA序列中GC-Ratio最高的子序列查找、两个字符串的最长公共子串以及MP3播放器歌曲列表的上下键控制逻辑。通过Java实现,阐述了基本思路和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

督促自己——某客编程题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);
        }
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值