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