做了360的笔试,感觉真的是运气很好了,这次的笔试真的算非常简单的了。废话不多说,看题目。
题目一
题目大概是,有一段DNA,包含两种字符,A和T,科学家可以通过两种方式修改这种DNA,第一种是替换DNA上两个核酸的位置。第二种是直接把字符修改为另一种字符
输入两行,第一行是原始的DNA,第二行是目标DNA,保证长度是相同的
求最少的修改次数
样例输入:
ATTTAA
TTAATT
输出:3
这个题目看起来好像有点复杂,仔细一想其实很简单,就两个字符,不一样的时候可以交换,也可以更改。显然长度是一致的,没有改变长度的操作,所以很直接,如果可以交换直接交换,如果不能交换则修改。交换减少的不一样字符的数目为2,修改减少不一致的数目为1。
再来看交换,如果把A换成T,肯定有一个T被换成了A,如果把已经配对的T换成了A,那么相当于没换,因为不一样的数目没变。所以肯定是两者之间的互换。但是什么时候就不能交换了呢,显然就是所有的T已经被A交换完了,或者A被T交换完了。
如果已经有一种字符被交换完了,那么剩下的字符就只能修改了。所以统计不一样的字符数目,分开统计A不一样的时候,和T不一样的时候。交换的数目显然就是两个数中较小的数目。更改的数目就是多的数交换之后剩下的数目。所以总的修改次数,就是只管多的那个不一样的字符。
上面的例子中,两个DNA不相同的字符的索引有0,2,3,4,5。与原串的A不一样的字符索引是0,4,5。与原串的T不一样的字符索引是2,3。显然把0,4和2,3交换之后,剩下的5进行替换即可。所以就是统计与原串中A和T不一样的字符的数目,两者多的就是总的修改次数。
python 代码
origin=input()
target=input()
ori={
'A':0,'T':0}
for o,t in zip(origin,target):
if o!=t:
ori[o]+=1
print(max(ori['A'],ori['T']))
C++代码
int main()
{
string origin, target;
cin >> origin;
cin >> target;
int a[2] = {
0,0 };
for (int i = 0; i < origin.size(); i++)
if (origin[i] != target[i])
a[origin[i] == 'A'] += 1;
cout << (a