360笔试算法题 AT变换
Posted motorye
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了360笔试算法题 AT变换相关的知识,希望对你有一定的参考价值。
题目大致:顺序排列DNA链,只有A和T,例如ATTTAA,现在科学家改变该链,改变时可以单独改变一个字母,也可以把链里的字母两两交换。
求:最短的交换次数
例如:ATTTAA --> TTAATT 最少需要3次交换,先把第一个A换成目标T,接着把第3个和第5个交换,第4个和第6个交换。3次搞定
如果有更好的办法,欢迎点评,不足之处请提醒。
1 package com.motorye; 2 3 public class T360 { 4 public static void main(String[] args) { 5 /*Scanner scanner1 = new Scanner(System.in); 6 String s1 = scanner1.nextLine(); 7 Scanner scanner2 = new Scanner(System.in); 8 String s2 = scanner2.nextLine();*/ 9 String s1 = "ATTTAA"; 10 String s2 = "TTAATT"; 11 int totalTimes = 0; 12 13 char[] s1_chars = s1.toCharArray(); 14 char[] s2_chars = s2.toCharArray(); 15 16 int s1_A = 0; 17 int s2_A = 0; 18 19 //这里取A的次数 20 for(int i = 0; i<s1_chars.length; i++){ 21 if(s1_chars[i] == ‘A‘){ 22 s1_A++; 23 } 24 if(s2_chars[i] == ‘A‘){ 25 s2_A++; 26 } 27 } 28 29 //两种极端,全等或全不等 30 if(s1_A - s2_A == 0 || s1_A - s2_A == s1_chars.length){ 31 totalTimes += Math.abs(s1_A - s2_A); 32 }else if(s1_A - s2_A != 0) { 33 //这里写的else if 加条件,便于理解 34 //二者A数目不一样时候,必须替换差值次。 35 totalTimes += Math.abs(s1_A - s2_A); 36 //换成数目一样的以后,再两两替换 37 int k = 0; 38 int j = 0; 39 int i = k; 40 while(true){ 41 42 if(k == s1_chars.length){ 43 break; 44 } 45 if(j == s2_chars.length){ 46 break; 47 } 48 if(s1_chars[k] == s2_chars[j]){ 49 k++; 50 i = k; 51 j++; 52 }else { 53 //不相等,那就往后查找,直到相等的 54 while (s1_chars[i] != s1_chars[j]){ 55 if(i == s1_chars.length){ 56 break; 57 } 58 i++; 59 } 60 totalTimes+=1; 61 k++; 62 } 63 } 64 } 65 System.out.println(totalTimes); 66 } 67 }
以上是关于360笔试算法题 AT变换的主要内容,如果未能解决你的问题,请参考以下文章