学习内容
888.公平的糖果棒交换
我的代码:
class Solution {
public int[] fairCandySwap(int[] A, int[] B) {
int[] res=new int[2];
boolean flag=false;
//flag为false的情况即sumA>sumB
Arrays.sort(A);
Arrays.sort(B);
int sumA=getSum(A);
int sumB=getSum(B);
if(sumA<sumB){
int[] temp=A;
A=B;
B=temp;
int tempInt=sumA;
sumA=sumB;
sumB=tempInt;
flag=true;
}
int small;
int big;
for (int k : B) {
for (int j = A.length - 1; j >= 0; j--) {
small = k;
big = A[j];
if (sumA - big + small == sumB - small + big) {
if (flag) {
res[0] = big;
res[1] = small;
} else {
res[1] = big;
res[0] = small;
}
return res;
}
}
}return res;
}
int getSum(int[] a){
int count=0;
for (int j : a) {
count += j;
}
return count;
}
}
思路:
将糖果棒按照从小到大进行排序,然后比较糖果棒总量大小,大的从后往前找,小的从后往前找,使用双重循环,当发现较大集合总数减这个数字,较小集合加这个数字,会使得两个相当,就可以返回了.
优解代码1
class Solution {
public int[] fairCandySwap(int[] A, int[] B) {
int sumA = Arrays.stream(A).sum();
int sumB = Arrays.stream(B).sum();
int delta = (sumA - sumB) / 2;
Set<Integer> rec = new HashSet<Integer>();
for (int num : A) {
rec.add(num);
}
int[] ans = new int[2];
for (int y : B) {
int x = y + delta;
if (rec.contains(x)) {
ans[0] = x;
ans[1] = y;
break;
}
}
return ans;
}
}
思路:
其通过对于sumA - big + small == sumB - small + big
进行化简,可得一个形如这样的算式big==(sumA-sumB)/2+small
的算式,将A放入哈希表中,然后,逐个计算后面那个值,如果在hash表中存在则返回,无则找下一个.
优解代码2
public int[] fairCandySwap(int[] A, int[] B) {
int diff = 0;
boolean[] flags = new boolean[100001];
for(int num: A)
diff -= num;
for(int num: B){
diff += num;
flags[num] = true;
}
//4-9是计算A与B的差值,并将B的值放到预设的哈希表中
diff /= 2;//数据加工
for(int num: A){
int numB = num + diff;
if(numB > 0 && numB < 100001 && flags[numB])
return new int[]{num, num + diff};
}
return null;
}
}
思路:
与上一个的思路类似,但是有以下优化:
1.使用有无数组取代了hashmap.
2.不计算两个数组的和直接计算他们的差
3.numB > 0 && numB < 100001
这两个判断条件是为了去除Leecode给的脑瘫数据的影响.直接将其无视.
4.在这道题中,alice 的值必定比Bob少,这是一个隐含条件需要注意.
包裹浮动元素,开发实例,经验
包裹浮动元素
方法一(class选择器)
使用class选择器,对于最后一个,带有特定标志的容器,使用clear::both方法,即可使用.
不推荐.
方法二(伪元素选择器)
伪元素:
每个标签基本上会存在两个伪元素(一个在内容之前,一个在内容之后),
只不过他们没有值的时候被隐藏了,相当于两个被隐藏的标签.
需要改变属性:display:inline_block
才可以改变属性(宽度,长度等).
伪元素选择器需要设定了content
属性才能生效.
span::before{
content:"";
<!---为标签添加内容的属性,输出的时候会带有一个" "-->
}
span::after{
content:"";
}
使用方法:
clear命令
使用伪类选择器,选择目标标签的 after
伪元素选择器, 在选择器中加入 clear:both
命令就可以将浮动元素的特性给关掉.
加入可视浮动元素的元素命令
添加诸如float:left/right``position:absoulute
等命令,可以将内部元素变成inlineblock
进而让浮动元素可视,进而可以相互影响乃至被包裹.
浮动的使用效果
图片浮于文字上方
在图片上设定float
属性,可以在设定margin
后有较明显的图片浮于文字上方的结果.