牛客网编程基础6-8

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;
    }
};

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值