力扣编程题01

1160. 拼写单词

给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。

假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。

注意:每次拼写时,chars 中的每个字母都只能用一次。

返回词汇表 words 中你掌握的所有单词的 长度之和。

 

示例 1:

输入:words = ["cat","bt","hat","tree"], chars = "atach"
输出:6
解释: 
可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。
示例 2:

输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
输出:10
解释:
可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。
 

提示:

1 <= words.length <= 1000
1 <= words[i].length, chars.length <= 100
所有字符串中都仅包含小写英文字母

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

开始的时候做一个备份chars,我们遍历数组中每一个元素,当这个元素每一个字母在chars中检查到相应的单词,就删除这个单词,防止后面查找出错,然后继续查找,如果有一个元素找不到就退出去,继续下一个单词的查找,如果整个单词遍历完了都找到了,就加上他的长度。最后输出。

class Solution {
    public int countCharacters(String[] words, String chars) {
        String s = chars;//备份,后面会改变字符串
        int count = 0;//记录返回的数字
        boolean flag = false;//一个单词中一个字母没有通过,就结束这个单词,标记
        for (int i = 0;i<words.length;i++){
            chars = s;//初始化字符串
            for (int j = 0;j<words[i].length();j++){
                flag = false;//每个字母是否存在
                for (int k = 0;k<chars.length();k++){
                    if (chars.charAt(k)==words[i].charAt(j)){
                        int n = chars.indexOf(words[i].charAt(j));
                        chars = chars.substring(0, n)+chars.substring(n+1,chars.length());//如果存在了 就删除这个字母,否则后面会判断出错
                        flag = true;
                        break;
                    }
                }
                  if (flag == false){
                        break;
                    }
                    if (j == words[i].length()-1){
                        count+=words[i].length();
                    }//到单词的最后一个字母了,就结束这个单词,加上他的长度
            }
        }
        return count;
    }
}

1287. 有序数组中出现次数超过25%的元素

给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。

请你找到并返回这个整数

 

示例:

输入:arr = [1,2,2,6,6,6,6,7,10]
输出:6
 

提示:

1 <= arr.length <= 10^4
0 <= arr[i] <= 10^5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/element-appearing-more-than-25-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

  这个题只需要判断有几个重复的数字,如果重复的数字大于1/4这个数组的长度的话,就返回这个重复的数字。1/4数组长度需要对1/4数组长度向上取整,如果小于1的取1,数组长度等于1,返回第一个元素即可。

class Solution {
    public int findSpecialInteger(int[] arr) {
          if (arr.length==1){
            return arr[0];//如果只有一个元素,返回第一个元素
        }
        int count = 1;//有几个相同的
        int n = (int)Math.ceil((double)arr.length/4)>1?(int)Math.ceil((double)arr.length/4):1;//返回1/4数组,如果小于1按1算
        for (int i = 0;i<arr.length;i+=count){
            count = 1;//每次初始化count
            for (int j = i + 1;j<arr.length;j++){
                if (arr[i]==arr[j]){
                    count++;
                }
                if(count>n){
                    return arr[I];//返回这个数字
                }
            }
        }
         return 0;
    }
}

520. 检测大写字母

给定一个单词,你需要判断单词的大写使用是否正确。

我们定义,在以下情况时,单词的大写用法是正确的:

全部字母都是大写,比如"USA"。
单词中所有字母都不是大写,比如"leetcode"。
如果单词不只含有一个字母,只有首字母大写, 比如 "Google"。
否则,我们定义这个单词没有正确使用大写字母。

示例 1:

输入: "USA"
输出: True
示例 2:

输入: "FlaG"
输出: False
注意: 输入是由大写和小写拉丁字母组成的非空单词。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/detect-capital
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:我们首先判断第一个字母是否为大写,如果是,有一个flag记录大写字母个数,遍历完了数组之后我们判断这个单词有几个大写字母,如果为1个或者全部是,那么返回true,否则返回false。如果第一个为小写后面只要有大写就返回false,如果循环退出返回true。

  

class Solution {
    public boolean detectCapitalUse(String word) {
        int flag = 1;//记录大写字母个数
        if (word.charAt(0)>='A'&&word.charAt(0)<='Z'){//如果首字母是大写
            for (int i = 1;i<word.length();i++){
                if (word.charAt(i)>='A'&&word.charAt(i)<='Z'){
                    flag++;//每多一个大写,flag+1
                }
            }
            if (flag==word.length()||flag==1){
                return true;//如果全部为大写或者第一个为大写返回true
            }else {
                return false;
            }
        }else {
            for (int i = 1;i<word.length();i++){//如果首字母为小写
                if (word.charAt(i)>='a'&&word.charAt(i)<='z'){
                    continue;//如果后面有不是小写的 直接返回false
                }else {
                    return false;
                }
            }
                return  true;//全部小写,返回true
        }
    }
}

 

189. 旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
示例 2:

输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释: 
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的 原地 算法。


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

  我们首先取余,后面翻转的时候我们将翻转的右半部分放入一个新数组的前面,将翻转的左半部分放入新数组的右边即可。

class Solution {
    public void rotate(int[] nums, int k) {
        int []num = new int[nums.length];//将翻转后的放入
        int m = k%num.length;//如果次数大于数组长度避免错误
        for (int i = nums.length-m,j=0;i<nums.length;i++,j++){
            num[j] = nums[I];//开始翻转
        }
        for (int i = m,j = 0;i<nums.length;i++,j++ ){
            num[i] = nums[j];
        }
        for (int i = 0;i<num.length;i++){
            nums[i] = num[I];//代入原来数组
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值