给你一份『词汇表』(字符串数组) 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;
}
}
给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 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;
}
}
给定一个单词,你需要判断单词的大写使用是否正确。
我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如"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
}
}
}
给定一个数组,将数组中的元素向右移动 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];//代入原来数组
}
}
}