刷题网站:阶段1第一关:基本数据类型
1.三数之中的最大值
class Solution {
public:
/**
* @param num1: An integer
* @param num2: An integer
* @param num3: An integer
* @return: an interger
*/
int maxOfThreeNumbers(int num1, int num2, int num3) {
// write your code here
int max;
max=num1>=num2?num1:num2;
return max>=num3?max:num3;
}
};
简化一下
class Solution {
public:
/**
* @param num1: An integer
* @param num2: An integer
* @param num3: An integer
* @return: an interger
*/
int maxOfThreeNumbers(int num1, int num2, int num3) {
// write your code here
return num1>=num2?(num1>=num3?num1:num3):(num2>=num3?num2:num3);
}
};
2.大小写转换
考察ASCII码。
直接对char
进行比较的话,就是比较ASCII码值的大小。
class Solution {
public:
/**
* @param character: a character
* @return: a character
*/
char lowercaseToUppercase(char character) {
// write your code here
//return character-32;//小写转大写,测试用例只有小转大
//完整转换
if(character>=65 && character<=90)
return character+32;
else return character-32;
}
};
不过审题的话就会发现,只需要一句return character-32;
即可。
3.判断数字与字母字符
还是ASCII。
class Solution {
public:
/**
* @param c: A character.
* @return: The character is alphanumeric or not.
*/
bool isAlphanumeric(char c) {
// write your code here
if((c>=65 && c<=90) || (c>=97 && c<=122) || (c>=48 && c<=57))
return true;
else
return false;
}
};
这里有点问题,默认输入的字符和数字都是个位数。
如果不记得ASCII码的位置,可以直接用字符:
参考解题思路
class Solution {
public:
/**
* @param c: A character.
* @return: The character is alphanumeric or not.
*/
bool isAlphanumeric(char c) {
// write your code here
if((('0' <= c)&&(c <= '9'))||(('a' <= c)&&(c <= 'z'))||(('A' <= c)&&(c <= 'Z'))){
return true;
}
else{
return false;
}
}
};
再简单点,直接库函数,但都只能判断一位数字或字母。
isdigit();//判断是不是数字
isalpha();//判断是不是字母
isalnum();//判断是不是数字或字母
扩展:
islower();//判断是否小写字母
isupper();//判断是否大写字母
//复习整理一下
class Solution {
public:
/**
* @param c: A character.
* @return: The character is alphanumeric or not.
*/
bool isAlphanumeric(char c) {
// write your code here
#if 0
if((c>=65 && c<=90) || (c>=97 && c<=122) || (c>=48 && c<=57))
return true;
else
return false;
#endif
#if 0
if( (isdigit(c)) || (isalpha(c)) )
return true;
else
return false;
#endif
return isalnum(c);
}
};
依据扩展思路,重新解第2题,消耗稍微小一点:
class Solution {
public:
/**
* @param character: a character
* @return: a character
*/
char lowercaseToUppercase(char character) {
// write your code here
if(islower(character))
return character-32;
else
return character+32;
}
};
4.月份天数
闰年问题,之前讲过。
class Solution {
public:
/**
* @param year: a number year
* @param month: a number month
* @return: return the number of days of the month.
*/
int getTheMonthDays(int year, int month) {
// write your code here
//主要分平年,闰年,区分2月,其余月份是固定的天数
//首先判断是否闰年(整除400,或者整除4的非百倍数)
if(year%400==0 || (year%4==0 && year%100!=0))
{
//先解决2月
if(month==2) return 29;
else if(month==2 || month==4 || month==6 || month==9 || month==11)
return 30;
else return 31;
}
else
{
if(month==2) return 28;
else if(month==2 || month==4 || month==6 || month==9 || month==11)
return 30;
else return 31;
}
}
};
5.闰年
同上
class Solution {
public:
/**
* @param n: a number represent year
* @return: whether year n is a leap year.
*/
bool isLeapYear(int n) {
// write your code here
if(n%400==0 || (n%4==0 && n%100!=0))
return true;
else return false;
}
};
6.生成给定大小的数组
class Solution {
public:
/**
* @param size: An integer
* @return: An integer list
*/
vector<int> generate(int size) {
// write your code here
vector<int> a;
for(int i=1;i<=size;i++)
{
a.push_back(i);
}
return a;
}
};
主要问题还是对vector
的不熟悉,没事慢慢来。
首先定义的时候,只需要一个名称即可,和以前的数组完全不一样;
其次,存入一定时push_back
,和数组赋值是不一样的;
最后,返回的时候也是,名称即地址。
梳理到vector
的时候再一并整理。
但是不太清楚击败94%的方法是什么······
6.交换数组两个元素
主要还是考察vector
,需要注意,取vector
中的值的时候,还是直接使用数组一样的索引即可。
class Solution {
public:
/**
* @param A: An integer array
* @param index1: the first index
* @param index2: the second index
* @return: nothing
*/
void swapIntegers(vector<int> &A, int index1, int index2) {
// write your code here
int tmp;
tmp=A[index1];
A[index1]=A[index2];
A[index2]=tmp;
}
};
7.整数排序
主要考察几种排序方法,全忘了。灵机一动想起来插入排序了。
选择排序参考1.2 选择排序,1.1 冒泡排序
简单来说,插入排序是从第2个起和前面的所有比较,找到合适的位置插入;选择排序是从第1个起在后面对比找到最小的依次放在前面;冒泡排序是从第1个起比较相邻两个,升序排列,找到最大的依次放在后面。
swap
函数直接用于交换两个量。
class Solution {
public:
/**
* @param A: an integer array
* @return: nothing
*/
void sortIntegers(vector<int> &A) {
// write your code here
#if 0
//试一下插入
int tmp;
for(int i=1;i<A.size();i++)
{
for(int j=0;j<i;j++)
{
if(A[i]<A[j])
{
tmp=A[i];
A[i]=A[j];
A[j]=tmp;
}
}
}
#endif
//选择排序
int tmp;
int num;
for(int i=0;i<A.size()-1;i++)
{
num=i;
tmp=A[i];
for(int j=i+1;j<A.size();j++)
{
if(A[j]<tmp)
{
tmp=A[j];
num=j;
}
}
if(num!=i)
{
A[num]=A[i];
A[i]=tmp;
}
}
//也可以用
#if 0
for (int i = 0; i < arr.size() - 1; i++) {
int min = i;
for (int j = i + 1; j < arr.size(); j++)
if (arr[j] < arr[min])
min = j;
std::swap(arr[i], arr[min]);
}
#endif
//冒泡
int all=A.size();
for(int i=0;i<A.size()-1;i++)
{
for(int j=0;j<A.size()-1-i;j++)
{
if(A[j]>A[j+1]) swap(A[j],A[j+1]);
}
}
}
};
冒泡的时候注意,最好不要在判断条件出现<A.size()-2
这样的表示,若A
只有1个元素,就会出现错误。
8.数组的最大值
首先给个暴力解。
class Solution {
public:
/**
* @param A: An integer
* @return: a float number
*/
float maxOfArray(vector<float> &A) {
// write your code here
float tmp=A[0];
for(int i=1;i<A.size();i++)
{
tmp=tmp>A[i]?tmp:A[i];
}
return tmp;
}
};
其实按顺序做,这里是考察7中的排序算法。
class Solution {
public:
/**
* @param A: An integer
* @return: a float number
*/
float maxOfArray(vector<float> &A) {
// write your code here
sort(A.begin(),A.end());//默认升序
return A[A.size()-1];
}
};
主要用到自动排序函数sort()
,其次取vector
元素总数用size()
。
参考sort()函数详解
sort(首元素地址(必填), 尾元素地址的下一个地址(必填), 比较函数(非必填));