牛客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.小易喜欢的单词
题目
小易喜欢的单词具有以下特性:
- 单词每个字母都是大写字母
- 单词没有连续相等的字母
- 单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
例如:
- 小易不喜欢"ABBA",因为这里有两个连续的'B'
- 小易不喜欢"THETXH",因为这里包含子序列"THTH"
- 小易不喜欢"ABACADA",因为这里包含子序列"AAAA"
- 小易喜欢"A","ABA"和"ABCBA"这些单词
给你一个单词,你要回答小易是否会喜欢这个单词(只要不是不喜欢,就是喜欢)。
思路和解答
- 检测是不是符合他不喜欢的标准,满足任意一个就是不喜欢,都不满足就是喜欢
- 那么如何检测每一项标准呢?
-
大写字母直接通过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')