这是我参与更文挑战的第14天
,活动详情查看更文挑战
题目
猜数字游戏的规则如下:
每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。 你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):
- -1:我选出的数字比你猜的数字小 pick < num
- 1:我选出的数字比你猜的数字大 pick > num
- 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num 返回我选出的数字。
- 示例 1:
输入:n = 10, pick = 6 输出:6
- 示例 2:
输入:n = 1, pick = 1 输出:1
- 示例 3:
输入:n = 2, pick = 1 输出:1
- 示例 4:
输入:n = 2, pick = 2 输出:2
提示:
- 1 <= n <= 231 - 1
- 1 <= pick <= n
解题思路
使用二分查找,根据int guess(int num)的返回值,判断目标数在哪个区间,返回-1说明在当前区间的左部分区间, 返回1说明在当前区间的右部分区间。
代码
/**
* Forward declaration of guess API.
* @param num your guess
* @return -1 if num is lower than the guess number
* 1 if num is higher than the guess number
* otherwise return 0
* int guess(int num);
*/
public class Solution extends GuessGame {
public int guessNumber(int n) {
int l=1,r=n;
while (l<=r)
{
int mid=(r-l)/2+l;
if(guess(mid)==0){
return mid;
}else if(guess(mid)==-1)
{
r=mid-1;
}else{
l=mid+1;
}
}
return -1;
}
}
题目二
给你一个字符串数组 words(下标 从 0 开始 计数)。
在一步操作中,需先选出两个 不同 下标 i 和 j,其中 words[i] 是一个非空字符串,接着将 words[i] 中的 任一 字符移动到 words[j] 中的 任一 位置上。
如果执行任意步操作可以使 words 中的每个字符串都相等,返回 true ;否则,返回 false 。
- 示例 1:
输入:words = ["abc","aabc","bc"] 输出:true 解释:将 words[1] 中的第一个 'a' 移动到 words[2] 的最前面。 使 words[1] = "abc" 且 words[2] = "abc" 。 所有字符串都等于 "abc" ,所以返回 true 。
- 示例 2:
输入:words = ["ab","a"] 输出:false 解释:执行操作无法使所有字符串都相等。
解题思路
因为字符串之间的字符可以无限次的交换,所以我们可以看成是将所有字符重新组合成若干个相同的字符串,字符串的个数必须等于words数组中元素的个数n,因此我们只需要统计每个字符出现的次数,检查字符个数是否可以整除n,可以整除说明该字符可以平均分到n个字符串里面,就可以判断出是否可以使得每个字符串都相等
代码
class Solution {
public boolean makeEqual(String[] words) {
int[] cnt = new int[26];
for (String s : words) {
for (char c : s.toCharArray()) {
cnt[c-'a']++;
}
}
for (int i=0;i<26;i++)
{
if(cnt[i]%words.length!=0)
return false;
}
return true;
}
}