第二天..

练习

1247. 交换字符使得字符串相同

有两个长度相同的字符串 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<String > 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<String > 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]<Cstr[j]){//后面比前面大
                    chars[i]=Cstr[j];
                    temp=j+1;//定位 从后面+1开始找 [j,m-n],[J+1,m-n+1]...
                }
            }
        }
        return String.valueOf(chars);
    }
}

从上午看到下午,说实话,很懵逼,看了人家的代码也是懵逼,今天是懂了,感觉明天就忘了

后面提交就怎么都提交不过去,因为系统给了什么鬼数字 888999998989090890780709707907 巨长无比 用系统给你的Integer根本行不通,Long也不行 必须转成String

感谢大神

http://t.csdn.cn/wRUYt

八股

JDK 和 JRE 有什么区别?

jdk是java的开发工具包 jre是java的开发和运行环境

jdk包含jre 如果只运行java可以用jre 如果要编译java就用jdk

== 和 equals 的区别是什么?

==比较数据类型 是比较值

==比较引用类型 是比较地址

equals比较值相等

注 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

两个对象的 hashCode()相同,则 equals()也一定为 true,对吗

不对 即使对象的哈希值相等,equals也不一点是true 因为它们的键值对不一定相等

final 在 java 中有什么作用?

最终类 不能被继承 修饰的变量叫常量且常量初始化后值不能被修改

final修饰的方法不能被重写

java 中的 Math.round(-1.5) 等于多少?

Math.round(1.5)=2 Math.round(-1.5)=-1

如果是Math.round(-1.6)= -2 因为-1.6+0.5=-1.1

String 属于基础的数据类型吗?

不属于 它属于对象 基本数据类型有8种 byte char boolean int short long float double

java 中操作字符串都有哪些类?它们之间有什么区别?

string stringBuffer stringBuilder

string声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作

stringBuffer是线程安全的 但是性能比stringBuilder慢

stringBuilder是线程不安全的 但是性能比stringBuffer快

String str="i"与 String str=new String("i")一样吗?

内存分配方式不一样 前者存到常量池 后者存到堆内存

如何将字符串反转?

使用stringBuffer stringBuilder的reverse()就可以

RabbitMQ学习第一天

  1. 什么是MQ?

本质是个队列 遵循FIFO先入先出原则

  1. MQ特点

解决流量高峰,应用解耦 异步处理

  1. RabbitMQ

RabbitMQ 是一个消息中间件

四大核心概念:

生产者(产生数据发送消息的程序),交换机,队列,消费者(等待接收消息的程序)

connection信道 极大降低了操作系统建立TCP信道的开销

安装半天 一天结束了

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值