牛客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')
原文地址:https://www.cnblogs.com/Howfars/p/9806410.html