2017年校招全国统一模拟笔试(第五场)编程题集合

https://www.nowcoder.com/test/5986669/summary

第一题:给你n块瓷砖,每块瓷砖都有颜色,但是我们不想相邻的瓷砖颜色一致,所以要进行替换,求最少的替换数

思路:把连续的瓷砖分成两种情况,一是两块相连的,一个是三块相连的,两块相连的,替换哪个都一样,三块的替换中间的最优

 1 import java.util.*;
 2  
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner cin = new Scanner(System.in);
 6         String str = cin.nextLine();
 7         int num[] = new int[50];
 8         int ans = 0;
 9         for(int i = 1;i<str.length()-1;i++){
10             if(str.charAt(i)==str.charAt(i-1)&&str.charAt(i)==str.charAt(i+1)&&num[i-1]!=1&&num[i]!=1){
11                 num[i] = 1;
12                 ans++;
13             }
14         }
15         for(int i = 0;i<str.length()-1;i++){
16             if(str.charAt(i)==str.charAt(i+1)&&num[i]!=1&&num[i+1]!=1){
17                 ans++;
18             }
19         }
20         System.out.println(ans);
21     }
22 }

 

第二题:求最长的DNA序列

思路:统计相连的ATCG即可

 1 import java.util.*;
 2  
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner cin = new Scanner(System.in);
 6         String str = cin.nextLine();
 7         int num[] = new int[50];
 8         int ans = 0;
 9         for(int i = 0;i<str.length();i++){
10             if(str.charAt(i)=='A'||str.charAt(i)=='T'||str.charAt(i)=='C'||str.charAt(i)=='G'){
11                 int tmp = 0;
12                 while(i<str.length()){
13                     if(str.charAt(i)=='A'||str.charAt(i)=='T'||str.charAt(i)=='G'||str.charAt(i)=='C')
14                         tmp++;
15                     else
16                         break;
17                     i++;
18                 }
19                 if(tmp>ans)
20                     ans = tmp;
21             }
22         }
23         System.out.println(ans);
24     }
25 }

 

第三题:一个字符串由两个相同字符串连接而成,就称这个字符串是偶串,求最少删多少个字符可以构成

思路:每次删两个,然后对半比较

 1 import java.util.*;
 2  
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner cin = new Scanner(System.in);
 6         String str = cin.nextLine();
 7         for(int i = str.length()-2;i>0;i-=2){
 8             if(deal(str.substring(0,i))){
 9                 System.out.println(i);
10                 break;
11             }
12         }
13     }
14     static boolean deal(String str){
15         int tmp = str.length()/2;
16         for(int i = 0;i<str.length()/2;i++){
17             if(str.charAt(i)!=str.charAt(i+tmp))
18                 return false;
19         }
20         return true;
21     }
22 }

 

第四题:没有看懂那个是啥

 

 

第五题:给定一个整数的长度N,根据已给的提示猜这个数字。第i个提示是"Y"或者"N",这个数是否是i的倍数,请计算出长度为n的合法的提示的个数。

思路:如果第I是个素数的话,那么这个数与前面的数没有任何关系。

  如果第i个数不是素数的话,那么它与前面的它的因数统一即可

  如果第i个是素数的次方的话,它不能唯一确定,它得取决于前面的值,总数也就是前面的因数+1

 1  import java.util.Scanner;
 2     public class Main {
 3         public static void main(String[] args) {
 4             Scanner scanner = new Scanner(System.in);
 5             int len=scanner.nextInt();
 6             long ans=1;
 7             boolean[] visited = new boolean[len+1];
 8             for(int i=2; i<=len; i++) {
 9                 if(visited[i])
10                     continue;
11                 for(int j=2*i; j<=len; j+=i)
12                     visited[j] = true;
13                 int count=0;
14                 long k=i;  //int会溢出
15                 while(k<=len) {
16                     k*=i;
17                     count++;
18                 }
19                 ans=ans*(count+1)%1000000007;
20             }
21             System.out.println(ans);
22         }
23     }

 

 

转载于:https://www.cnblogs.com/Tree-dream/p/8552461.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值