狂刷OJ基础题两天,OJ机考成功半小时全部AC了

Posted adventure.Li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了狂刷OJ基础题两天,OJ机考成功半小时全部AC了相关的知识,希望对你有一定的参考价值。

一、背景

我们学校有个程序设计实践(C\\C++版),成绩就是平时给了54题刷够50+就平时分满分,期末考试就是上机考试八题(大概分为数论、简单计算、时间显示、进制转换、字符串、递归、枚举几大类型),只要能够全部AC则可满分。

二、总结

  1. 心得感悟

一定多刷题,而注重基础;如果有基础,考前也得刷刷熟悉熟悉(本人就是考前两天,连续刷了大概五十道基础题吧,我走的时候看了看榜单在我前面几个都是平时刷题上百道的,平时榜单前面的人,所以说千万要动手敲敲)虽然对于一个大三的老油条去考人家大一的OJ在线考试,但是如果不注重基础很容易不能够全部AC。

下面大概是用devc++刷了一整天从 10点到晚上1点左右的记录,有时会卡顿,可能一直不对,但是没有关系,再返回来读题看是不是理解错误题意了,或者看看输出是否有问题格式。
在这里插入图片描述
在这里插入图片描述

  1. 对于明年需要参加类似考试的朋友们,给以下建议

对于刚学习的朋友来说,可能最大的困难在于语言的学习;因此对于大一的朋友一定先把语言基础打牢,弄清C语言中 函数复用,数组存储 循环计算这三大法宝,然后了解学习高级用法比如说string字符串,结构体,指针,vector,map stl类 这些结构会为你省不少事儿,最后再了解algorithm、math包的一些库函数。当你把工具使用熟练之后,就可以开始按照一下步骤去刷题。

进制转换

基本策略:对于转十进制的数,可以string存储非十进制数,然后遍历字符串,按字符串的位子权重进行累加即可。对于超出十进制使用A、B来代表10,11的解决办法 巧妙利用ASCII码建立hash数组映射, 或者直接map映射即可
对于十进制转其他进制,采用取余,整除即可。模板如下


int toTen(string val,int curScale){
	int res=0;
	int curVal=1;//对应权重
    for(int i=val.length()-1;i>=0;i--){
    	if(val[i]-'0'>=curScale)
    	   return -1;
    	res+=(val[i]-'0')*curVal;
		curVal*=curScale;   
	}
	return res;
}
string map[16]={"1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
 
 // 任意型转10 使用string
 // 10转任意使用%,/ 
void handle(int p,int q,string r){
	// p当前进制,q目标进制 
	int curVal = toTen(r,p);
	string res="";
	while(curVal){
		int temp = curVal%q;
		res=map[temp-1]+res;
		curVal/=q;
	}
	cout<<res<<endl;
} 

简单计算

基本策略:处理分析问题,基本上使用数组循环即可解决,如开灯问题、校门外的树等,另外巧妙使用printf()格式控制处理保留小数问题。(也属于数学问题)

数论

基本上了解gcd、lcm、素数问题即可了。

字符串

掌握find()、length()、s[i]取个字符串(char型),+进行拼接即可。巧妙利用ASCII进行与数的转换 真的十分好用。
出题类型:统计单词数量(遍历判断)、子串匹配问题(模式匹配)

时间显示

策略:先计算得出天数,然后按照计算星期几(%7循环取余),年月日这样去推。注意处理闰年问题。

// P1022 日历问题2
// 已知 2007 年 10 月 10 日,请求出 nn 天后是几月几号
// 11:33开始
// 11:34去上厕所 
// later....
// 12:18继续 
// 12:34初版 
#include"iostream"
using namespace std;
// 年月日的进行处理

int reapYear(int y){//判断是否闰年 
	if( y%400==0 || y%4==0&&y%100!=0 ){
		return 1;
	}
	return 0;
}

int yearMap[2]={365,366};
int monthMap[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,
                     31,29,31,30,31,30,31,31,30,31,30,31 };

void handle(int n){
	int year=2007,month=10,day=10;

   while(n>=yearMap[reapYear(year)])
   {
   	  n-=yearMap[reapYear(year)];
      year++;
   }
   
   while(n>=monthMap[reapYear(year)][month-1]){
   	  n-=monthMap[reapYear(year)][month-1];// map映射 
   	  month++;
   	  if(month==13){// 越界问题考虑 
   	  	month=1;
   	  	year++;
	  }
   }	
   
   if(day+n>monthMap[reapYear(year)][month-1]){
   	  day = day+n-monthMap[reapYear(year)][month-1];
	  month++;
   	  if(month==13){
   	  	month=1;
   	  	year++;
	  }
   }else{
   	  day=day+n;
   }
   
   
   
   // 格式问题
//   if(month<10&&day<10){
//   	cout<<year<<"-0"<<month<<"-0"<<day<<endl;
//   }else if(month<10){
//   	cout<<year<<"-0"<<month<<"-"<<day<<endl;
//   }else if(day<10){
//   		cout<<year<<"-"<<month<<"-0"<<day<<endl;
//   }else{
//   	 	cout<<year<<"-"<<month<<"-"<<day<<endl;
//   }
   printf("%d-%02d-%02d\\n",year,month,day);// 格式输出
}

void hanlde2(int n){
//	    //dayofweek=days%7;
//	    
//	    for(int i=2007;n>=year[leapyear(i)];i++)
//		    n-=year[leapyear(i)];
//	    for(j=0;days>=month[leapyear(i)][j];j++)
//		    n-= month[leapyear(i)][j];
//	    
//		printf("%d-%02d-%02d %s\\n",i,j+1,n+1);//,week[dayofweek]
} 

 
int main(){
	int n;
//	while(cin>>n){
//		handle(n);
//	}
	for(int i=1;i<=2000;i++)
	  handle(i); 
	return 0;
	
} 

大数问题

数组存储,然后进行计算,处理进位借位问题,再考虑边界问题。此类问题可以分为加减乘除以及N阶乘(再分麦粒问题)。

递归问题

掌握斐波那数类型(爬楼梯,青蛙过河)、汉诺塔、放苹果(两个参数)、划分曲线常见类型即可。

最后,我将简单计算、时间显示、进制转换、高精度、字符串、枚举、递归的部分OJ题以及OJ入门学习PPT上传到网盘,需要的朋友可以下载学习参考。

链接:https://pan.baidu.com/s/1lYhzIe5xvVbx6HjmO_p_Gg
提取码:1213
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V4的分享

以上是关于狂刷OJ基础题两天,OJ机考成功半小时全部AC了的主要内容,如果未能解决你的问题,请参考以下文章

#OJ没有一次AC题解01-010309

剑指Offer面试题九度OJ1384:二维数组中的查找

东华大学OJ基础题63题疑问记录

#OJ没有一次AC题解02-010314

数据结构二叉树经典OJ练习

剑指Offer面试题 九度OJ1516:调整数组顺序使奇数位于偶数前面