1.1、已知循环缓冲区是一个可以无限循环读写的缓冲区,当缓冲区满了还继续写的话就会覆盖我们还没读取到的数据。下面定义了一个循环缓冲区并初始化,请编写它的Write函数:
#include <iostream>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
using namespace std;
typedef struct Ringbuf{
char * Buf;
unsigned int Size;
unsigned int RdId;
unsigned int WrId;
}Ringbuf;
void Init(Ringbuf* ringBuf,char *buf,unsigned int size)
{
memset(ringBuf,0,sizeof(Ringbuf));
ringBuf->Size=size;
ringBuf->Buf=buf;
ringBuf->RdId=0;
ringBuf->WrId=0;
}
int rb_data_size(Ringbuf* rb)
{
return (rb->WrId-rb->RdId)&(rb->Size-1);
}
int rb_free_size(Ringbuf* rb)
{
return(rb->Size-1-rb_data_size(rb));
}
void write(Ringbuf* ringBuf,char * buf,unsigned int strlen)
{
unsigned int pos=ringBuf->WrId;//记录我们写指针的偏移
while(pos+strlen>ringBuf->Size){//判断我们写的字节数是否大于整个buffer长度
memcpy(ringBuf->Buf+pos,buf,ringBuf->Size-pos);//将我们的内容直接拷贝到偏移位置
buf +=(ringBuf->Size-pos); //获取要拷贝的buf地址
strlen -=ringBuf->Size-pos; //计算多出来的长度
pos=0;
}
memcpy(ringBuf->Buf+pos,buf,strlen);//将多出来的长度的内容搬到基址开始,从我们的buf中继续写过来,实现循环
ringBuf->WrId=pos+strlen; //移动我们的写指针
}
void display(Ringbuf* ringbuf)
{
for(int i=0;i<ringbuf->Size;i++){
cout<<ringbuf->Buf[i];
}
cout<<endl;
}
int main()
{
Ringbuf *rb=(Ringbuf*)malloc(sizeof(Ringbuf));
char init_str[16]=" ";
int size=sizeof(init_str);
Init(rb,init_str,size);
char p[]="1234567";
write(rb,p,8);
display(rb);
return 0;
}
具体参考:
https://www.freesion.com/article/16821075305/
2、N X N数组,输出行中最小,列中最大的数的位置,比如:
1 2 3
4 5 6
7 8 9
输出:row=2,col=0
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
typedef pair<int,int> PAIR;
int n;
bool cmp_by_value(const PAIR& a,const PAIR& b){
return a.second<b.second;
}
struct Axis{
int x;
int y;
};
int flag=0;
Axis Findpoint(vector<vector<int> >& arr)
{
int row=arr.size();
int col=arr[0].size();
int i;
int j;
int i_min;
int j_max;
Axis axis;
for(i=0;i<row;i++){
i_min=arr[i][0];
for(j=0;j<col;j++){
if(arr[i][j]<i_min){
i_min=arr[i][j];
}
}
for(j=0;j<col;j++){
j_max=arr[0][j];
for(int k=0;k<col;k++){
if(j_max<arr[k][j]){
j_max=arr[k][j];
}
}
if(arr[i][j]==i_min){
if(arr[i][j]==j_max){
flag=1;
axis.x=i;
axis.y=j;
return axis;
}
}
}
}
if(flag==0){
cout<<"NONE"<<endl;
}
}
int main()
{
int n;
cin>>n;
vector<vector<int> > vec(n,vector<int>(n));
Axis axis;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>vec[i][j];
}
}
axis=Findpoint(vec);
if(flag){
cout<<axis.x<<" "<<axis.y<<endl;
}
return 0;
}