题目总结
1.给你一个二进制数组 nums
。
你可以对数组执行以下操作 任意 次(也可以 0 次):
- 选择数组中 任意连续 3 个元素,并将它们 全部反转 。
反转 一个元素指的是将它的值从 0 变 1 ,或者从 1 变 0 。
请你返回将 nums
中所有元素变为 1 的 最少 操作次数。如果无法全部变成 1 ,返回 -1 。
示例 1:
输入:nums = [0,1,1,1,0,0]
输出:3
解释:
我们可以执行以下操作:
- 选择下标为 0 ,1 和 2 的元素并反转,得到
nums = [1,0,0,1,0,0]
。 - 选择下标为 1 ,2 和 3 的元素并反转,得到
nums = [1,1,1,0,0,0]
。 - 选择下标为 3 ,4 和 5 的元素并反转,得到
nums = [1,1,1,1,1,1]
。class Solution {
public:
int minOperations(vector<int>& nums) {
int n = nums.size();
int ans = 0;
for (int i = 0; i + 2 < n; i++) {
if (nums[i] == 0) {
for (int j = 0; j < 3; j++)
{
if(nums[i+j]==0)
nums[i + j] = 1;
else
nums[i+j]=0;
}
ans++;
}
}
if (nums[n - 2] && nums[n - 1]) return ans;
return -1;
}
};
根据题目模拟
2.给你一个字符串
word
,请你使用以下算法进行压缩: - 从空字符串
comp
开始。当word
不为空 时,执行以下操作:- 移除
word
的最长单字符前缀,该前缀由单一字符c
重复多次组成,且该前缀长度 最多 为 9 。 - 将前缀的长度和字符
c
追加到comp
。
- 移除
-
返回字符串
comp
。示例 1:
输入:word = "abcde"
输出:"1a1b1c1d1e"
解释:
初始时,
comp = ""
。进行 5 次操作,每次操作分别选择"a"
、"b"
、"c"
、"d"
和"e"
作为前缀。对每个前缀,将
"1"
和对应的字符追加到comp
。
class Solution {
public:
string compressedString(string word) {
int ans = 1;
string res = "";
for(int i = 0; i < word.size(); i++){
if(ans == 9 || word[i] != word[i + 1]){
res += '0' + ans;
ans = 1;
res += word[i];
}else{
ans++;
}
}
return res;
}
};
0' + ans
这个表达式将会计算字符'0'
的 ASCII 值加上ans
的值。在大多数编程语言中,字符'0'
的 ASCII 值是 48(十进制)。- 假设
ans
的值是 1,那么'0' + ans
就相当于48 + 1
,即49
。
3.给你两个整数数组
nums1
和nums2
,长度分别为n
和m
。同时给你一个正整数k
。如果
nums1[i]
可以被nums2[j] * k
整除,则称数对(i, j)
为 优质数对(0 <= i <= n - 1
,0 <= j <= m - 1
)。返回 优质数对 的总数。
示例 1:
输入:nums1 = [1,3,4], nums2 = [1,3,4], k = 1
输出:5
解释:
5个优质数对分别是
(0, 0)
,(1, 0)
,(1, 1)
,(2, 0)
, 和(2, 2)
。
lass Solution {
public:
int numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {
int count=0;
for(int i=0;i<nums1.size();i++){
for(int j=0;j<nums2.size();j++){
if(nums1[i]%(nums2[j]*k)==0){
count++;
}
}
}
return count;
}
};
java总结
面向对象的三大特征
1.封装
2.继承
3.多态
类
可以把类理解成某种概念,对象才是一个具体存在的实体。在java中必须先设计类才能创建对象。类的格式如下:
publiclass 类名 { 成员变量 成员方法 构造器 代码块 内部类 }
对于类的对象,可以通过,类名 对象名 =new 类名();的形式得到。
如何使用对象
访问属性 :对象名.成员变量
访问行为 :对象名。方法名()
此外,类名首字母为大写,为英文。
一个java文件可以定义多个class类,且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。
封装
对象代表什么,就等封装对应的数据,并提供数据对应的行为。
public关键词
表示在所有类中都可以使用public修饰的成员,在定义成员变量和成员方法时默认为public修饰。
private关键词
1.是一个权限修饰符
2.可以修饰成员(成员变量和成员方法)
3.被privat修饰的成员只能在本类中访问
public class gril {private int age;public void setage(int a){age=a;}public int getage(){return age;} }
在上图中age被private修饰,在创建对象时就不能对age进行赋值。只能通过类里面的setage方法进行赋值,getage方法来获得age的值。
this关键字
成员变量:定义在方法外的变量。
局部变量:定义在方法内的变量。
public class gril {private int age;(成员变量)public void s(){int age=10;(局部变量)System.out.println(age);} }
在上述代码中变量的调用遵循就近原则,谁离调用语句近就调用谁。
如果想要调用成员变量,则需要用this关键字修饰再去调用。
public class gril {private int age;(成员变量)public void s(){int age=10;(局部变量)System.out.println(this.age);} }
this的本质代表方法调用者的地址值
构造方法
在创建对象的时候对成员变量进行赋值。
方法名与类名一致没有返回值,连void都不能有。
不能手动调用构造器,在创建对象时由虚拟器调用。
每创建一次对象,就会调用一次构造方法。
public class gril {private int age;(成员变量)//如果我们自己没写构造方法//虚拟机会自己添加空参构造方法public gril() { }public gril(int age) {this.age=age; } }
gril s=new gril();就会调用空参构造。
gril s=new gril(13);就会调用带参构造。
字符串就是一连串的字符序列,Java提供了String、StringBuffer和StringBuilder三个类来封装宇符串,并提供了一系列方法来操作字符串对象。
String:
是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
StringBuilder:
是JDK1.5新增的类,它也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是,StringBuffer是线程安全的,而StringBuilder 则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用StringBuilder类。
String
直接赋值获取字符串对象
String s1="abc";
当字符串直接赋值时,系统会检查字符串在堆内存中的串池是否存在,如果不存在创建新的
否则将会复用。
使用new的方式来获取一个字符串对象
//空参构造,可以获取一个空白的字符串对象 String s2=new String(); //传递数组,创建对象 char []chs={'a','b'}; String s4=new String(chs);
当要修改字符串内容时可以将要修改内容用数组存储,再来创建对象,通过修改数组内容,达到修改字符串对象的目的。
对于String还可以传递字节数组,来创建字符串对象。
byte[] bytes={97,98,99,100}; String s5=new String(bytes); System.out.println(s5) //打印abcd
使用new的方法获取字符串是先在堆中开辟个一个空间存储创建的内容,再将存储的地址值赋值给左边的变量,并且不会存在复用的情况。
比较
在java中关于比较,对于基本数据类型是比较数据值,对于引用数据类型是比较地址值。
字符串中有两种比较方法equals和equalslgnoreCase(忽略英文大小写)。
String s1=new String("abc"); String s2="ABC"; boolean result=s1.equals(s2); System.ou.println(result)//falseboolean result2=s1.equalsIgnoreCase(s2); System.ou.println(result2)//true
StringBuilder
作用:提高字符串的操作效率
打印对象为属性值不是地址值.
其中有如下操作方法
public StringBuilder append()
添加数据返回数据本身
public StringBuilder reverse()
反转容器中的内容
public int length()
返回长度
public String toString()
将StringBuilder转化为String
StringBuilder sb=new Stringbuilder("abc"); //添加元素 sb.append(1); System.out.println(sb);//abc1 //反转 sb.reverse(); System.out.println(sb);//cba //获取长度 int a=sb.length(); System.out.println(a);//3 //变回字符串 String str=sb.toString(); System.out.println(str);//abc
StringJoiner
public StringJoiner(间隔符)
public StringJoiner(间隔符号,开始符号,结束符号)