leetcode 374. 猜数字大小 and 1897. 重新分配字符使所有字符串都相等

219 阅读3分钟

这是我参与更文挑战的第14天 ,活动详情查看更文挑战 image.png

题目

猜数字游戏的规则如下:

每轮游戏,我都会从 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;
    }
}

image.png