程序员面试金典_2020_10_9

面试题 10.11. 峰与谷

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
    int len=nums.size();
    for(int i=1;i<len;i++)
    {
        if(i%2==0)
        {
            if(nums[i]<nums[i-1])
            swap(nums[i],nums[i-1]);//峰
        }
        else 
        {
            if(nums[i]>nums[i-1])
            {
               swap(nums[i],nums[i-1]);
            }
        }
    }
    }
};

面试题 16.01. 交换数字

class Solution {
public:
    vector<int> swapNumbers(vector<int>& numbers) {
   return {numbers[0]^numbers[1]^numbers[0],numbers[1]^numbers[0]^numbers[1]};
    }
};

面试题 16.02. 单词频率

class WordsFrequency {
public:
map<string,int>m;
    WordsFrequency(vector<string>& book) {
   for(int i=0;i<book.size();i++)
   {
       m[book[i]]++;
   }
    }
    
    int get(string word) {
    if(m[word])
    {
        return m[word];
    }
    else return 0;
    }
};

/**
 * Your WordsFrequency object will be instantiated and called as such:
 * WordsFrequency* obj = new WordsFrequency(book);
 * int param_1 = obj->get(word);
 */

面试题 16.03. 交点

class Solution {
public:
    vector<double> intersection(vector<int>& start1, vector<int>& end1, vector<int>& start2, vector<int>& end2) {
        vector<double> left1, left2;
        vector<double> right1, right2;
        vector<double> mid;
        left1.push_back(start1[0]*1.0);
        left1.push_back(start1[1]*1.0);
        right1.push_back(end1[0]*1.0);
        right1.push_back(end1[1]*1.0);
        left2.push_back(start2[0]*1.0);
        left2.push_back(start2[1]*1.0);
        right2.push_back(end2[0]*1.0);
        right2.push_back(end2[1]*1.0);
        if(!judge_intersection(left1, right1, left2, right2))
            return vector<double>();
        while(sqrt(pow(right1[0]-left1[0], 2)+pow(right1[1]-left1[1], 2))>0.0000001) {
            mid.clear();
            mid.push_back((left1[0]+right1[0])/2);
            mid.push_back((left1[1]+right1[1])/2);
            if(judge_intersection(left1, mid, left2, right2))
                right1 = mid;
            else
                left1 = mid;
        }
        return left1;
    }
    bool judge_intersection(vector<double> start1, vector<double> end1, vector<double> start2, vector<double> end2) {
        vector<double> A, B;
        A.push_back(end1[0]-start1[0]);
        A.push_back(end1[1]-start1[1]);
        B.push_back(end2[0]-start2[0]);
        B.push_back(end2[1]-start2[1]);
        vector<double> tmp1, tmp2;
        double t1, t2, t3, t4;
        tmp1.push_back(start2[0]-start1[0]);
        tmp1.push_back(start2[1]-start1[1]);
        tmp2.push_back(end2[0]-start1[0]);
        tmp2.push_back(end2[1]-start1[1]);
        t1 = A[0] * tmp1[1] - A[1] * tmp1[0];
        t2 = A[0] * tmp2[1] - A[1] * tmp2[0];
        tmp1.clear();
        tmp2.clear();
        tmp1.push_back(start1[0]-start2[0]);
        tmp1.push_back(start1[1]-start2[1]);
        tmp2.push_back(end1[0]-start2[0]);
        tmp2.push_back(end1[1]-start2[1]);
        t3 = B[0] * tmp1[1] - B[1] * tmp1[0];
        t4 = B[0] * tmp2[1] - B[1] * tmp2[0];
        if(t1*t2>0 || t3*t4>0)
            return false;
        if(t1*t2==0 && t3*t4==0) {
            if(start1[0]<start2[0] && end1[0]<start2[0] && start1[0]<end2[0] && end1[0]<end2[0])
                return false;
            if(start1[1]<start2[1] && end1[1]<start2[1] && start1[1]<end2[1] && end1[1]<end2[1])
                return false;
            if(start2[0]<start1[0] && end2[0]<start1[0] && start2[0]<end1[0] && end2[0]<end1[0])
                return false;
            if(start2[1]<start1[1] && end2[1]<start1[1] && start2[1]<end1[1] && end2[1]<end1[1])
                return false;
        }
        return true;
    }

};

面试题 16.04. 井字游戏

class Solution {
public:
    string tictactoe(vector<string>& board) {
    int n=board.size();//行 列
    vector<int>parow(n,0),pacol(n,0),pbrow(n,0),pbcol(n,0);
    int xpa1=0,xpa2=0,xpb1=0,xpb2=0;
    int i,j,cnt=0;
    for( i=0;i<n;i++)
    {
        for( j=0;j<n;j++)
        {
            if(board[i][j]=='X')
            {
                parow[i]++;
                pacol[j]++;
                if(i==j) xpa1++;
                if(i+j==n-1) xpa2++;
                cnt++;
            }
            else if(board[i][j]=='O')
            {
                pbrow[i]++;
                pbcol[j]++;
                if(i==j) xpb1++;
                if(i+j==n-1) xpb2++;
                cnt++;
            }
        }
    }
    char win='-';
    for(int i=0;i<n;i++)
    {
        if(parow[i]==n||pacol[i]==n||xpa1==n||xpa2==n)
        {
            win='X';
            break;
        }
        if(pbrow[i]==n||pbcol[i]==n||xpb1==n||xpb2==n)
        {
            win='O';
            break;
        }
    }
    if(win=='X') return "X";
        if(win=='O') return "O";
        if(cnt == n*n) return "Draw";
        return "Pending";

    }
};


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值