zoukankan      html  css  js  c++  java
  • 牛客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')
    
  • 相关阅读:
    Java实现 LeetCode 343 整数拆分(动态规划入门经典)
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 338 比特位计数
    H264(NAL简介与I帧判断)
    分享一段H264视频和AAC音频的RTP封包代码
  • 原文地址:https://www.cnblogs.com/Howfars/p/9806410.html
Copyright © 2011-2022 走看看