PAT刷题思路(01)

  1. 简单模拟(不涉及算法,根据题目描写来进行代码编写,考察代码能力)
  2. 查找元素
  • (给定一些元素,查找某个满足条件的元素,查找是基本功
  • 查找方法(若在小范围数据里查找  则遍历即可,若查找范围较大,则可用二分查找等方法
  1. 图形输出(图形其实就是由字符构成 , 弄清楚规则就行。两种方法 )
  • 根据题目描述自己找出规律,直接输出
  • 定义一个二维字符数组,通过规律填充,然后输出整个二维数组(A1031)
  1. 日期处理(注意细节  大小月  平年闰年  细节繁琐)
  2. 进制转化
  3. 字符串处理(能很好体现代码能力, 有些题目中实现逻辑非常麻烦, 且有很多细节和边界  要注意)
  4. 排序(一套连招直接带走  sort + cmp +strcmp+struct+数组{条件特别多可用二维数组表三个数据  有时要用变长数组vector},vector详细用法另一篇文章有)
  5. 散列思想  (直接把输入的数作为数组的下标来统计这个数的性质(****))(若输入的数太大 大于10^9  或者干脆为字符串  如“I love you”之类的  把这些元素转化为整数  如石头剪刀布问题)(散列一句话就是  将元素通过一个函数转化为整数, 使得该整数可以尽量唯一地代表这个元素
  6. 贪心算法(求解一类最优化问题的方法
  7. 二分查找(大部分二分法问题是寻找有序序列中第一个满足某条件的元素位置, left right与mid,解决此类问题固定模板如下
  8.   
    //"解决寻找有序序列第一个满足某条件元素的位置"问题固定模板
    //二分区间为【left, right】, 初值必须能覆盖解的所有可能取值
    int solve(int left, int right){
    int mid;
    while(left < right){
    mid = (left + right)/2
    if(条件成立){
    right = mid;//左子区间【left,mid】中查找
    }else{
    left = mid + 1; //在有子区间【mid + 1, right】查找
    }
    }
    return left;//返回夹出来的位置
    }

    使用二分法时当right - left < le-5  即认为已经满足精度要求  求出mid

  9. two pointers  

  • 常用函数

  • C++输入字符串函数不可使用gets函数了, 要用fgets(字符串名称, 最大长度, stdin)

  • cin >> a >> n >> c  读入一整行用getline

  • 若为char变量  cin.getline(str, 100)  char str[100]

  • 若为string变量  cin.getline(cin.str)

  • string(字符串)用法  只能用cin于cout    

  • string a = 123  string b =  50   a + b = 12350   b + a = 50123

  • return a+ b < b+a  返回拼起来最小的那个

  • 两个string可直接比较  按照字典序  string长度为 str.length()或者string.size()

  • str.erase(str.begin() + 4)  str.erase(str.begin() + 2, str.end()-1)

  • max()与 min函数  与 abs()都在#include  若求三个xyz最大值  则 max(x, max(y, z));

  • abs(x)返回x的绝对值   x必须为整数   若为浮点数  则用fabs(x);

  • swap(x, y)  交换x与y的值

  • fill(a, a+5, 233)//将数组这一区间的值全部赋为233

  • upper_bound(first, last, val)  用来寻找【first, last)范围内第一个大于val的值

  • lower_bound是找第一个大于等于的值

  • 且想要查询元素下标直接让返回值减去数组首地址   lower_bound(a, a+ 3, 3) - a    ****这两个函数求的是下标

  • 有段错误可能输数组越界

  • int 类型可是-2的32次方到2的32次方   

  • long long 是 -2的63次方到2的63次方,左闭右开

  • 若两个正数之和为负数  或者两个负数之和为正数,就是溢出

  • 善用bool flag  true与false

  • 题目的输出要求现在第一行用注释写出来  活用计数器cout

  • 指数系数用c[i][j]

  • cout << index1 <<" "<< index2;  如果使用cout想要输出空格的话

  • cout换行的两种方法  一种是  cout <<  n << endl(end line 的缩写)

  • cout << n  << "\n" << db <

  • 用if必须打括号  不然容易弄混

  • cin与cout 来自#include   只有用string的时候才能才有cin与cout 因为其在大量数据的读入输出时非常糟糕

  •  if(t1 < temp1){
                temp1 = t1;
                index1 = id;
            }

    以上为固定模板  在查找需要的值,如最大最小值时可以用temp来存储  用index来存储下标来指向数组中的如“WTL”之类的英语字母

  • 把它们存储到⼆维字符数组中,⼀开始初始化字符数组为空格,然后按照u型填充进去(图形打印)

  • char c[81], u[30][30]; memset(u, ' ', sizeof(u));

  • isdigit函数   isdigit(char c)

  • 用法:#include

    功能:判断字符c是否为数字

    说明:当c为数字0-9时,返回非零值,否则返回零。

  • isalpha

    原型:int isalpha( int c )

    头文件:C++ (C语言使用)

    功能:判断字符c是否为英文字母

    说明:若为英文字母,返回非0(小写字母为2,大写字母为1)。若不是字母,返回0

    在标准c中相当于使用“ isupper( c ) || islower( c ) ”做测试

  • isupper

     

    原型:extern int isupper(int c);

    头文件:(旧版本的编译器使用)

    功能:判断字符c是否为大写英文字母

    说明:当参数c为大写英文字母时,返回非零值,否则返回零

    附加说明: 此为宏定义,非真正函数

  • islower(char c)

     

    原型:int islower(int c)

    头文件:#include(旧版本的编译器使用)

    功能:测试字符c是否为小写字母

    说明:若参数c为小写英文字母,则返回TRUE,否则返回NULL(0)

    附加说明:此为宏定义,非真正函数。

  •  

  •  

  • string week[7] = {"MON ", "TUE ", "WED ", "THU ", "FRI ", "SAT ", "SUN "};

  • string类型的数组  在其下标做文章

  •  

    if(a[i] == b[i] &&((a[i] >= 'A' && a[i] <= 'N') || isdigit(a[i])))  使用 && || >= <= 别忘了加括号

     

     

  • if(c < 0){ 
            printf("-");
            c = - c;
        }
    

    时刻注意变量的值

  •  if(i%3==0 && i > 0)  printf(",");

    注意循环极限情况

  • sum += (c[i] - '0')  注意要 - ‘0’

  • ****

  • 字符数组

  •  

    string数组的定义有三种:

    String arr[] = new String[10]; //创建一个长度为10的String 类型数组。
  • 1
  • String arr[] = {"张三","李四"};
    String[] arr = new String[10];
  • to_string 函数:将数字常量转换为字符串,返回值为转换完毕的字符串

    头文件:#include

    string s = to_string(i); //将整数i转换为字符串表示形式

    string to_string (int val);
    string to_string (long val);
    string to_string (long long val);
    string to_string (unsigned val);
    string to_string (unsigned long val);
    string to_string (unsigned long long val);
    string to_string (float val);
    string to_string (double val);
    string to_string (long double val);

    ————————————————

  • 下为sum += a[i] - '0'
  • 应该是把字符型数据转换为整型,在ACSII码表中,字符‘0’的十进制值是48,假设有一个字符为‘0’,那么计算机识别出来的十进制值是48,而不是0。所以可以通过问题上的公式可以把字符型的0转化为整型的0。同理,可以把1到9的字符转换成整型的1到9,看一下ASCII码表就懂了,不难的。通俗来讲就是一个数据类型的转换,这种操作在单片机上的数据转换用得会比较多,但一般是反过来用,把十进制的整型数字转换成字符型数字,然后在一些显示设备上打印出来。

  •  

  • 字符数组(char数组)当维度为一维时 是字符串   char str[] = "GOOD STORY"  为二维时为字符串数组

  • 注意  %s 通过空格来识别一个字符串的结束

  • gets 是用来输入一行字符串的  puts同理

  • strlen(str)   strcmp(字符数组1, 字符数组2)  

  • strcpy(字符数组1, 字符数组2)  把字符数组2复制给字符数组1

  • strcat(字符数组1, 字符数组2)   把2接到1的后面

  •  

你可能感兴趣的:(学习)