有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 "x" 和 "y",你需要通过「交换字符」的方式使这两个字符串相同。
每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。
交换只能发生在两个不同的字符串之间,绝对不能发生在同一个字符串内部。也就是说,我们可以交换 s1[i] 和 s2[j],但不能交换 s1[i] 和 s1[j]。
最后,请你返回使 s1 和 s2 相同的最小交换次数,如果没有方法能够使得这两个字符串相同,则返回 -1 。
示例 1:
输入:s1 = "xx", s2 = "yy"
输出:1
解释:
交换 s1[0] 和 s2[1],得到 s1 = "yx",s2 = "yx"。
示例 2:
输入:s1 = "xy", s2 = "yx"
输出:2
解释:
交换 s1[0] 和 s2[0],得到 s1 = "yy",s2 = "xx" 。
交换 s1[0] 和 s2[1],得到 s1 = "xy",s2 = "xy" 。
注意,你不能交换 s1[0] 和 s1[1] 使得 s1 变成 "yx",因为我们只能交换属于两个不同字符串的字符。
示例 3:
输入:s1 = "xx", s2 = "xy"
输出:-1
示例 4:
输入:s1 = "xxyyxyxyxx", s2 = "xyyxyxxxyx"
输出:4
提示:
1 <= s1.length, s2.length <= 1000
s1, s2 只包含 'x' 或 'y'。
class Solution {
public int minimumSwap(String s1, String s2) {
char[] a = s1.toCharArray();
char[] b = s2.toCharArray();
int a1=0;int b1=0;
for (int i = 0; i < s1.length(); i++) {
if(a[i]=='y'&&b[i]=='x'){
a1++;
}
if(a[i]=='x'&&b[i]=='y'){
b1++;
}
}
return (a1+b1)%2==1?-1:(a1+1)/2+(b1+1)/2;
}
}
算法真的,以前没接触过,今天又见识到贪心算法了 想了一上午没成功,在力扣上刷题总有十几个测试用例过不去,看了看大神写的,感觉自己写的真的难看。
总结:
从示例一和示例二得知
* 都是先交换成为xx yy后 再进行s1[0] s2[1] 的交换
* 而他们的前提就是 xy和yx加一起是偶数 如果是奇数 就返回-1(两两交换)
* 所以先比较有无xx yy 有了就先交换 之后再找xy和yx (贪心交换)
* 发现结论
* 如果有m对xy和n对yx 且m+n为偶数
* 都是偶数 则全部两两交换 总匹配 (M+N)/2
* 都是奇数 则一组贪心交换 剩下两两交换 总匹配 (M+N)/2+1
* 也就是(m+1)/2+(n+1)/2
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
class Solution {
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i+1; j < nums.length; j++) {
if(nums[i] + nums[j] == target){
return new int[]{i,j};
}
}
}
return new int[]{0};
}
}
如果说记忆中什么最深刻,那就是两个for
除了很脑残的想不出来返回一个new int[]{} 其余还好
给定任意一个数字 m,然后给出数字 n,则需在 m 中去掉 n 位数,保持各位顺序不变的情况下,得到最大数。
输入描述:
输入整数n,m.(1<=n<=1e100,1<=m<=100)
输出描述:
输出删除后的最大数。
示例
示例1
输入
1234 2
输出
34
import java.util.ArrayList;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str_0 = scan.nextLine();
String[] line_list_0 = str_0.trim().split(" ");
ArrayList arr = new ArrayList<>();
for(int i = 0; i < line_list_0.length; i++){
arr.add(String.valueOf(line_list_0[i]));
}
scan.close();
String result = solution(arr);
System.out.println(result);
}
public static String solution(ArrayList arr){
String str=arr.get(0);//eg:1234
int n= Integer.parseInt((arr.get(1)));//eg: 2
int m= str.length();//eg:4
char[] chars = new char[m-n];//eg:4-2=2 新的数字是2位数
char[] Cstr=str.toCharArray();//转换字符串成字符数组
for (int i = 0,temp=0; i < m-n; i++) {//存在m-n位数字
//想了好久 因为要按照顺序 所以需要有个指针去定位
//也就是说 本来 第一次[0,m-n]第二次[0,m-n+1]第三次[0,m-n+2]..
//因为要按照顺序来
//不能从开始找
//位置不再是从0开始,而是上一次找到最大值的下一个位置开始寻找;
for (int j = temp; j <=n+i; j++) {//每次i循环 j都要更新边界
if(chars[i]
从上午看到下午,说实话,很懵逼,看了人家的代码也是懵逼,今天是懂了,感觉明天就忘了
后面提交就怎么都提交不过去,因为系统给了什么鬼数字 888999998989090890780709707907 巨长无比 用系统给你的Integer根本行不通,Long也不行 必须转成String
感谢大神
http://t.csdn.cn/wRUYt
jdk是java的开发工具包 jre是java的开发和运行环境
jdk包含jre 如果只运行java可以用jre 如果要编译java就用jdk
==比较数据类型 是比较值
==比较引用类型 是比较地址
equals比较值相等
注 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
不对 即使对象的哈希值相等,equals也不一点是true 因为它们的键值对不一定相等
最终类 不能被继承 修饰的变量叫常量且常量初始化后值不能被修改
final修饰的方法不能被重写
Math.round(1.5)=2 Math.round(-1.5)=-1
如果是Math.round(-1.6)= -2 因为-1.6+0.5=-1.1
不属于 它属于对象 基本数据类型有8种 byte char boolean int short long float double
string stringBuffer stringBuilder
string声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作
stringBuffer是线程安全的 但是性能比stringBuilder慢
stringBuilder是线程不安全的 但是性能比stringBuffer快
内存分配方式不一样 前者存到常量池 后者存到堆内存
使用stringBuffer stringBuilder的reverse()就可以
什么是MQ?
本质是个队列 遵循FIFO先入先出原则
MQ特点
解决流量高峰,应用解耦 异步处理
RabbitMQ
RabbitMQ 是一个消息中间件
四大核心概念:
生产者(产生数据发送消息的程序),交换机,队列,消费者(等待接收消息的程序)
connection信道 极大降低了操作系统建立TCP信道的开销
安装半天 一天结束了