牛客网编程基础6-8

来源:互联网 发布:手动安装windows补丁 编辑:程序博客网 时间:2024/04/20 01:09

6.5-血型遗传检测
题目描述
血型遗传对照表如下:
父母血型 子女会出现的血型 子女不会出现的血型
O与O O A,B,AB
A与O A,O B,AB
A与A A,O B,AB
A与B A,B,AB,O ——
A与AB A,B,AB O
B与O B,O A,AB
B与B B,O A,AB
B与AB A,B,AB O
AB与O A,B O,AB
AB与AB A,B,AB O
请实现一个程序,输入父母血型,判断孩子可能的血型。
给定两个字符串father和mother,代表父母的血型,请返回一个字符串数组,代表孩子的可能血型(按照字典序排列)。
测试样例:
”A”,”A”
返回:[”A”,“O”]

分析:这题一看便知可以通过找规律通过合理的if-else解决,匹配不同的结果。父母血型中有AB的为一类进行处理,剩下的分为一类。剩下的父母血型匹配中儿女会出现的血型必然有O,父母有A必有A,有B必有B,一A一B必有AB。
但这样代码会显得繁琐,不简便,可以使用STL里的map,简化代码,提高编码效率。

class ChkBloodType {public:    vector<string> chkBlood(string father, string mother) {        // write code here        vector<string> str;        if(father=="AB"||mother=="AB")        {            str.push_back("A");            if(father!="O"&&mother!="O")                str.push_back("AB");            str.push_back("B");        }        else        {            if(father=="A"||mother=="A")            {                str.push_back("A");                if(father=="B"||mother=="B")                {                    str.push_back("AB");                    str.push_back("B");                    str.push_back("O");                }                else                     str.push_back("O");            }            else if(father=="B"||mother=="B")            {                if(father=="A"||mother=="A")                {                    str.push_back("A");                    str.push_back("AB");                    str.push_back("B");                    str.push_back("O");                }                else                 {                    str.push_back("B");                    str.push_back("O");                }            }            else                 str.push_back("O");        }        return str;    }};

7.字符串替换
题目描述
请你实现一个简单的字符串替换函数。原串中需要替换的占位符为”%s”,请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。
测试样例:
“A%sC%sE”,7,[‘B’,’D’,’F’]
返回:”ABCDEF”

分析:开始看到这题,直接上手用最简单的思路,定义一个新的字符串B,当A[i]和A[I+1]等于%s时,替换,到最后如果arg字符数组没有用完,那就补充到B的后面。
看到讨论区里很多大牛使用STL里字符串封装好的函数,方便又快捷,晚上洗澡听班上的大牛也说要学会使用STL,思想是要掌握,但效率一定要提高!深受启发~

class StringFormat {public:    string formatString(string A, int n, vector<char> arg, int m) {        // write code here        string B;        int i=0,j=0,q=0;        while(i<n)        {            if( A[i]=='%'&& i<n-1&& A[i+1]=='s' )            {                B+=arg[j++];                i+=2;            }            else            {                B+=A[i++];            }        }        while(j<m)        {            B+=arg[j++];        }        return B;    }};

8.棋子翻转
题目描述
在4x4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),现在依次有一些翻转操作,要对一些给定支点坐标为中心的上下左右四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色。
给定两个数组A和f,分别为初始棋盘和翻转位置。其中翻转位置共有3个。请返回翻转后的棋盘。
测试样例:
[[0,0,1,1],[1,0,1,0],[0,1,1,0],[0,0,1,0]],[[2,2],[3,3],[4,4]]
返回:[[0,1,1,1],[0,0,1,0],[0,1,1,0],[0,0,1,0]]

分析:这题与我之前做的一个课设(马踏棋盘)挺像的,不过略简单,只要理解支点坐标的上下左右不一定都存在便可,还有就是求反的方法很多,我用的是当前值-1求绝对值便可求反了。
正好明天巩固下马踏棋盘的思想~

class Flip {public:    vector<vector<int> > flipChess(vector<vector<int> > A, vector<vector<int> > f) {        // write code here        int i,j;        for(i=0;i<3;i++)        {            if( f[i][0]-2>=0 )            {                A[f[i][0]-2][f[i][1]-1] = abs(A[f[i][0]-2][f[i][1]-1] -1 );            }            if( f[i][1]-2>=0 )            {                A[f[i][0]-1][f[i][1]-2] = abs(A[f[i][0]-1][f[i][1]-2] -1 );            }            if( f[i][0]<4 )            {                A[f[i][0]][f[i][1]-1] = abs(A[f[i][0]][f[i][1]-1] -1 );            }            if( f[i][1]<4 )            {                A[f[i][0]-1][f[i][1]] = abs(A[f[i][0]-1][f[i][1]] -1 );            }        }        return A;    }};

希望路过的大牛看过代码和分析之后能给小弟一些建议,感激不尽~

原创粉丝点击