学习内容
888.公平的糖果棒交换
我的代码:
class Solution {public int[] fairCandySwap(int[] A, int[] B) {int[] res=new int[2];boolean flag=false;//flag为false的情况即sumA>sumBArrays.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后有较明显的图片浮于文字上方的结果.
