面试题 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";
}
};