• 牛客21天刷题_day#2


    牛客21天刷题_day#2

    Contents

    1.禁忌雷炎

    题目

    圆的半径平方为S,求坐标系里在这个圆周上面的整数坐标点有几个

    输入
    25
    3
    输出
    12
    0

    思路和解答

    • 首先,四个象限对称,所以直接算出一个象限的数字,然后乘以4即可
    • 那么,如何计算每一个象限的数目呢?遍历横坐标i(从1到int(sqrt(s))),计算s-i2,判断是否是整数,是整数那么计数值加1
      • int()是向下取整,因为超过半径的整数,就不需要考虑了,已经超过了圆周的范围
    math.sqrt(4)
    
    2.0
    
    type(math.sqrt(4))
    
    float
    
    math.sqrt(4)==int(math.sqrt(4))
    
    True
    

    注意range的语法

    range(start, stop[, step])

    参数说明:

    start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
    stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
    step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
    
    import math
    S=25
    num=0
    for i in range(1,int(math.sqrt(S))+1):#由于range的上述语法限制,上限应该加1
        if math.sqrt(S-i*i)==int(math.sqrt(S-i*i)):
    #         print(i)
            num+=1
    print(4*num)
    
    12
    

    关于python的标准输入输出

    参考链接:Python标准输入标准输入和输出

    • sys.stdin是一个只读的文件对象(键盘被读取),sys.stdout是一个可写的文件对象(屏幕被写入)
    • sys.stdin与可读文件对象具有相同的类型,sys.stdout与可写文件对象具有相同的类型
    • StringIO:将字符串当做文件来进行处理
    • urllib:查看网页文件
    import sys
    sys.stdin.readline().strip()#这一句的意思是读取键盘的输入,然后去除最后的换行符
    
    #raw_input()可以达到跟上边一句相同的效果
    
    ''
    

    由于需要读取多个输入,所以上面的代码还需要进行小小的改动,最终解答如下

    import math
    while True:#不断地读入,直到读到结束符EOF(end of file)
        try:
            S = int(raw_input().strip())
            num=0
            for i in range(1,int(math.sqrt(S))+1):#由于range的上述语法限制,上限应该加1
                if math.sqrt(S-i*i)==int(math.sqrt(S-i*i)):
            #         print(i)
                    num+=1
            print(4*num)
        except EOFError:#通过try...except达到了一个循环停止的效果(为什么不可以通过一个循环终止条件来写呢)
            break
    

    2.小易喜欢的单词

    题目

    小易喜欢的单词具有以下特性:

    1. 单词每个字母都是大写字母
    2. 单词没有连续相等的字母
    3. 单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
      例如:
    • 小易不喜欢"ABBA",因为这里有两个连续的'B'
    • 小易不喜欢"THETXH",因为这里包含子序列"THTH"
    • 小易不喜欢"ABACADA",因为这里包含子序列"AAAA"
    • 小易喜欢"A","ABA"和"ABCBA"这些单词
      给你一个单词,你要回答小易是否会喜欢这个单词(只要不是不喜欢,就是喜欢)。

    思路和解答

    1. 检测是不是符合他不喜欢的标准,满足任意一个就是不喜欢,都不满足就是喜欢
    2. 那么如何检测每一项标准呢?
    • 大写字母直接通过ascii码去判断,但是需要一个个字母去遍历

      • 也可以直接用string.upper()方法转成大写,然后判断是不是
    • 遍历的同时,比较上一个字母和当前字母是否相同

    • 第三个使用find方法,参考python find()方法

      • 语法
        str.find(str, beg=0, end=len(string))

      • 参数

      str -- 指定检索的字符串
      beg -- 开始索引,默认为0。
      end -- 结束索引,默认为字符串的长度。

      • 返回值

        如果包含子字符串返回开始的索引值,否则返回-1。

    • 看了一下官方的解答,就是暴力的四重循环...但是既然我用的是python,还是应该尽量利用python的一些方法去简化一下

    #include <iostream>
    #include <string>
    using namespace std;
    
    string judge(string word){
        string res[2] = { "Dislikes", "Likes" };
        int n = (int)word.size();
        for (int i = 1; i < n; i++){
            if(word[i] == word[i - 1])return res[0];
        }
        for (int i = 0; i < n; i++){
            for (int j = i + 1; j < n; j++){
                for (int k = j + 1; k < n; k++){
                    for (int w = k + 1; w < n; w++){
                        if (word[i] == word[k] && word[j] == word[w]) return res[0];
                    }
                }
            }
        }
        return res[1];
    }
    int main(){
        string s;
        cin >> s;
        cout << judge(s) << endl;
    }
    
    #尝试写一下第三个条件的判断
    class Getoutofloop(Exception):
        pass
    try:#这里的try...except是为了找到条件,打印结果之后,直接跳出两层循环
        s='THBTAH'
        for i in range(len(s)):
            if s.find(s[i],i+1)!=-1:
                index=s.find(s[i],i+1)
                print('i',i)
                print('找到的序号',index)
                for j in range(i+1,index):
                    if s.find(s[j],index+1)!=-1:
                        print("Dislikes")
                        raise Getoutofloop()
    except:
        pass
    #看上去简单一些,但是感觉跟循环其实也是一样的,因为find()本身应该也是一个个去遍历的吧...
    
    i 0
    找到的序号 3
    Dislikes
    

    Python跳出两层循环

    参考链接:python跳出多层循环

    最后通过的代码

    # -*- coding: utf-8 -*
    class Getoutofloop(Exception):#下面检测不喜欢的条件,一旦满足,直接输出Dislikes,否则抛出异常,并且输出Likes
        pass
    try:
        S=raw_input()#读取输入的字符串,S指向它
        if S.upper()!=S:#如果不全是大写字母,就是dislike
            raise Getoutofloop()
    
        for k in range(len(S)-1):#如果有两个连续字母相等,就是dislike
            if S[k]==S[k+1]:
                raise Getoutofloop()
    
        for i in range(len(S)):#如果满足第三个条件,就是dislike
                if S.find(S[i],i+1)!=-1:
                    index=S.find(S[i],i+1)
                    #print('i',i)
                    #print('找到的序号',index)
                    for j in range(i+1,index):
                        if S.find(S[j],index+1)!=-1:
                            #print("Dislikes")
                            raise Getoutofloop()
        print('Likes')#如果经过了之前的几次检测都没有抛出异常,就是Likes
    except:
        print('Dislikes')
    
  • 相关阅读:
    C++ 数组array与vector的比较
    C/C++头文件区别
    C/C++ 标准输入输出重定向
    C文件读写
    输入输出重定向
    【剑指offer26 二叉搜索树与双向链表】
    【剑指offer25 复杂链表的复制】
    【剑指offer23 二叉搜索树的后序遍历序列】
    【剑指offer22 从上往下打印二叉树 & 60 把二叉树打印成多行】
    【剑指offer21 栈的压入、弹出序列】
  • 原文地址:https://www.cnblogs.com/Howfars/p/9806410.html
Copyright © 2020-2023  润新知