学习内容

CSS实例,LeeCode

学习语言

CSS,HTML,Java
寒假学习CSSHTMLleeCode

CSS

文本框+按钮

知识

主要思路:利用margin使文本框距离窗口边框一个按钮的大小,使得两个容器分开,本质上是两个独立的组件,而不是相互依赖的.

代码

  1. *{
  2. margin: 0;
  3. padding: 0;
  4. }
  5. #left{
  6. height: 100px;
  7. background-color:aquamarine;
  8. margin-right: 200px;/*刚好错开一个按钮的位置*/
  9. z-index: 0;
  10. }
  11. #right{
  12. height: 100px;
  13. width: 200px;
  14. position: absolute;
  15. right: 0px;
  16. top: 0px;
  17. background-color: black;
  18. z-index: 1;
  19. }

效果图

image.png

BUG:

margin塌陷

现象

垂直方向的margin父子会取最大的来,只改变垂直margin不会改变相对位置.

解决方式

土鳖方法

在父上面加一条(越细越好)的线.加一个类似于这个的语句border-top:1px solid red

BFC方法

可以在CSS种加入这些语句来解决.
必须让他们被包裹在有以下语句的父内.
position:absolute;
diplay:inline-block;
overflow:hidden;隐藏溢出部分

兄弟元素垂直方向margin合并

现象

兄弟容器的垂直方向的空间会重叠

解决方式

1.使他们的计算中加入overflow:hidden,找一个父包裹目标实体.
2.通过将两个的值相加来解决,一般不使用BFC

浮动流

概述:

float:

提供一个将实体排序的方法.,类似于流处理的顺序,会将每个实体变成浮动元素,或者说变成一个border

性质

浮动元素会脱离原先的层.

所有产生浮动流的元素,只有块级元素看不到他们,产生了BFC的元素和文本类属性的元素以及文本都能看到浮动元素.

可以通过clear:both删除浮动流,使一个容器变得正常.
要包裹住一个浮动元素的流程:在浮动元素的最后加一个段落标签,在段落标签中加入clear:both,且对于怕

的大小无要求.

LeeCode(Java)

989.数组形式的整数加法

题目:

对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。

给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。

我的代码

  1. class Solution {
  2. public List<Integer> addToArrayForm(int[] A, int K) {
  3. ArrayList<Integer> one = new ArrayList<>();
  4. ArrayList<Integer> two = new ArrayList<>();
  5. for (int i = A.length-1; i >=0; i--) {
  6. one.add(A[i]);
  7. }
  8. for(;K!=0;K=K/10){
  9. two.add(K%10);
  10. }
  11. int c=0;
  12. ArrayList<Integer> res=new ArrayList<>();
  13. for (int i = 0; i < one.size(); i++) {
  14. int temp=one.get(i)+c;
  15. c=0;
  16. if(two.size()>=i+1){
  17. temp+=two.get(i);
  18. }
  19. if(temp>=10){
  20. c=1;
  21. }
  22. res.add(temp%10);
  23. }
  24. for(int i=one.size();i<two.size();i++){
  25. int temp=two.get(i)+c;
  26. c=0;
  27. if(temp>=10){
  28. c=1;
  29. }
  30. res.add(temp%10);
  31. }
  32. if(c==1){
  33. res.add(1);
  34. }
  35. ArrayList<Integer> result= new ArrayList<>();
  36. for (int i = res.size()-1; i >=0; i--) {
  37. result.add(res.get(i));
  38. }
  39. return result;
  40. }
  41. }

优解代码

  1. class Solution {
  2. public List<Integer> addToArrayForm(int[] A, int K) {
  3. LinkedList<Integer> res= new LinkedList<>();
  4. int i=A.length-1;
  5. while(i>=0 || K>0){
  6. if(i>=0){
  7. K+=A[i--];
  8. }
  9. res.addFirst(K%10);
  10. K/=10;
  11. }
  12. return res;
  13. }
  14. }

1.本质上的思路就是利用一个或while来保证两个都能被取到
2.计算的主干为K,从个位开始取K的数值,这也就意味着反着取数组的值
3.两个相加,当数组没有的时候,结果会直接添加K的该位值,而当K值取完的时候,K该位值为0,不影响数组的取值.
3.使用linkedList,便于使用addFirst()方法,避免了最后的取反

学到的地方

1.LinkedList相对来说会比较耗费内存,但是拥有addFirst()方法.
2.List.get()不能作为赋值的受体,需要使用set(Integer index,Integer Integer)方法来赋值.

202.快乐数

题目:

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

我的代码

  1. class Solution {
  2. public boolean isHappy(int n) {
  3. var sum=n;
  4. var flag=true;
  5. var temp=0;
  6. while(sum!=1){
  7. while (sum!=0){
  8. temp+=Math.pow(sum%10,2.0);
  9. sum/=10;
  10. }
  11. sum=temp;
  12. temp=0;
  13. if(sum==4){
  14. if(flag){
  15. flag= false;
  16. }else{
  17. return false;
  18. }
  19. }
  20. }
  21. return true;
  22. }
  23. }

1.使用的思路是非快乐数必定会进入一个4开头,4结尾的循环,所以我只需要将4出现两次的结果归于非快乐数,或者,其实当4第一次出现的时候就可以了.
2.这种方法,涉及数学知识,不涉及算法知识,不够好.

优解代码

  1. class Solution {
  2. public boolean isHappy(int n) {
  3. int faster=n;
  4. int slower=n;
  5. while(faster!=1&&slower!=1){
  6. faster=getNext(faster);
  7. faster=getNext(faster);
  8. slower=getNext(slower);
  9. if(faster!=1&&faster==slower){
  10. return false;
  11. }
  12. }
  13. return true;
  14. }
  15. private Integer getNext(int n){
  16. var sum=0;
  17. while(n!=0){
  18. sum+=Math.pow(n%10,2.0);
  19. n/=10;
  20. }
  21. return sum;
  22. }
  23. }

1.主体思想是使用快慢指针,即一个的速度较快,一个的速度较慢,如果他们俩最终能相当,那么就说明他们进入了循环.
2.以后一些关于循环判断的题目都可以使用快慢指针来解决.