本系列所选题目均来自力扣或者牛客网站. 所选题目主要是以其中的简单题为主, 中等题为辅, 包含少数困难题(原因是: 本人目前能力还不够~ ). 开展这个系列的目的是督促自己, 在暑假的时间里也要保持有一定的刷题量, 拒绝摆烂~
话不多说, 直接开刷~~
各位相加
题目描述: 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
解题思路:
(1) 在力扣官网给出的题解中, 有一种是通过数学的思想来解题~ 代码量非常少~ 大概只有两三行的样子~~ 但是属于是那种比较难想到的, 有兴趣可以自己去研究研究… 本人的思路与解法中的第二种比较类似, 都是通过直接求解的方法.
(2) 如若循环计算得到的数字小于10, 则直接返回这个值. 如若大于10, 则反复拆开每一位来进行相加得到一个新的值.
实现代码:
class Solution {
public int addDigits(int num) {
while(num>9){
int sum=0;
int n=num;
while(n>0){
int tmp=n%10;
n/=10;
sum+=tmp;
}
num=sum;
}
return num;
}
}
猜数字大小
题目描述: 猜数字游戏的规则如下:
每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):
-1:我选出的数字比你猜的数字小 pick < num
1:我选出的数字比你猜的数字大 pick > num
0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
返回我选出的数字。
解题思路:
(1) 类似这种猜数字的题目是很多的, 大致的思路都是通过二分的思想来实现的, 二分查找可以大大提高查找的效率.
(2) 二分的代码应该都是很熟悉的, 这里不多说, 但是要注意一点: int mid=left+(right-left)/2;
这里这段代码就相当于 int mid=(left+right)/2
, 但是前面的写法又相比于后面的写法会更加严谨, 因为如果是left和right的值都是很大的, 那么left+right的结果很可能就会因为过大而发生截断, 从而使结果错误, 而前面一种写法就很好地避免了这种情况. 又或者可以再进一步写成 int mid=left+((right-left)>>>2)
.
实现代码:
public class Solution extends GuessGame {
public int guessNumber(int n) {
int left=1;
int right=n;
while(left<right){
int mid=left+(right-left)/2;
if(guess(mid)<0){
right=mid-1;
}else if(guess(mid)>0){
left=mid+1;
}else{
return mid;
}
}
return left;
}
}