leetcode_027_RemoveElement

一. 问题描述

原文:

question description

翻译:

给定一个数组和一个数,原地删除所有与该数相同的元素,并返回删除后新数组的长度。


二. 分析

双指针同向从左到右遍历,交换到最后即可。

Accept代码

方法一

思路:略
java-代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 

public class Solution {
public int removeElement(int[] nums, int val) {
int i = 0, j = -1;

int count = 0;
while (i < nums.length) {
if (nums[i] != val) {
count++;
j++;
int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;

}
i++;
}

return count;
}

}


三. 总结

  • 官网难度: easy
  • 从属类型: 数组
  • 正确率: 34.7%
  • 相似题目推荐:无
  • 个人感觉:简单
评论

初探Activity生命周期

1. 理解几个重要的生命周期回调函数

android activity的生命周期是必须深入理解和掌握的,才能更好的开发出性能优良的app。

回调函数 适合处理的任务
onCreate() 初始化UI,及其他组件
onStart() 很快调用完进入Resume状态
onResume() Activity完全可见,可交互,有焦点
onPause() Activity被遮挡但可视,不可交互
onStop() 完全不可见,失去焦点,如进入别的Activity或APP
onDestroy() 资源回收,一般不用重写,大部分清理工作应该在onPause() & onStop()中完成
onRestart() 从Pause –> restart –> start –> resume
finish() 自己结束

将安卓各个生命周期理解为爬金字塔,可以很形象的记忆并理解。

Activity生命周期金字塔

2. Activity 的暂停与继续

其中三个回调函数可以长时间停留,与用户产生交互

  • onResume()
  • onStop()
  • onPause()

当一个Activity被部分遮挡,如弹出对话框,此时则会进入Pause状态。

如果被完全遮挡,则进入stop状态。

onPause()状态通常需要处理如下任务:

  • 停止一些消耗cpu的任务,如播放动画等
  • 保存一些需要保存的数据
  • 释放系统资源,如broadcast receivers ,传感器的引用(如摄像头,GPS,蓝牙等)一些耗电多的资源。

注意: 在onPause()中不要进行耗时任务,如数据库操作,这样会影响UI组件的显示效果。在onStop中处理耗时任务较为合适

3. Activity的 停止与重启

几个典型的Stop场景

  • 用户打开最近使用的APP,选择使用其他APP,此时便进入stop状态。

  • 从当前Activity跳转到另外一个Activity,则前一个进入stop状态,如果用户按back键返回,则重新restart。

Start / ReStart Activity
当Activity从后台stop变为前台可见时,系统回调onRestart(),onStart()方法。

注意:由于系统会保留处于Stop截断的Activity实例各种状态,一般的APP没太多必要重写 onRestart

4. 重建与恢复Activity

销毁

当系统因为内存过低等其他因素销毁了Activity(非正常销毁),尽管Activity Instance实例被回收,但是其状态被系统保存下来,以备恢复之需。

注意:旋转屏幕也会销毁与重建Activity,因为可能需要加载不同的适配资源。

恢复

Instance State存在一个key-value键值对集合中,即 Bundle对象。

注意:所有拥有Id的 View都会自动保存用户的输入,如edittext等。所以不必为此担心。


如果要存储Acivity的额外信息数据到bundle中,则需要重写onSaveInstanceState() 回调函数。

当Activity销毁时系统会自动传入一个bundle对象负责存储数据,当你需要用到之前的状态来重建Activity时,系统会传入刚才保存的bunlde对象到onCreate() & onRestoreInstanceState() 方法中。

恢复与重建过程示意
评论

JDBC要点记录

概述:JDBC就是java定义的通用的数据库API。通过不同数据库驱动可以方便连接不同的数据库如mysql,oracle,sql server等。


JDBC的使用

1.导入第三方库

需要导入相应的开发包,如使用MySql则导入mysql-connector-java-5.1.39.zip

2.获取Connnection

有几种方式不同连接到数据库
可以采用将相应信息如数据库url ,数据库名,密码等信息写入property配置文件。

配置文件在项目开发中十分常见通用,可以更好的解耦,如当你更换url,数据库,或者使用其他厂商数据库时,只需要改配置文件即可。

注意清理数据库相关资源也是不可或缺的。

代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;

try {

//---------------最原始的链接方法 ,耦合性较强--------------------------------
/*
// step1: 驱动管理器 ,注册驱动
DriverManager.registerDriver(new Driver());

//step2: get connection
Connection MySQLConnection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/homeworkdb", "root", "root");

//step3: create statement
java.sql.Statement statement = MySQLConnection.createStatement();
*/


//--------------利用Class类加载器 搭配 property配置文件进行解耦----------------

Properties dbconfigProperties = new Properties();
dbconfigProperties.load(new FileInputStream(new File("DBConf.prop")));

//通过类加载器,加载配置文件中指定的数据库驱动,创建mysql driver对象
Class.forName(dbconfigProperties.getProperty("dbdriver")).newInstance();

connection = DriverManager.getConnection(dbconfigProperties.getProperty("dburl"), dbconfigProperties);
statement = connection.createStatement();

//step4: create sql
resultSet = statement.executeQuery("select * from tutors;");

// do sth with resultSet



} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
//释放资源
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}


JDBC - CRUD操作

CRUD-增删改查是数据库也是软件开发的常见任务。

关键还是 编写 SQL语句的功力。
而作为开发工程师(非DBA,架构师等)最重要的数据库能力就是各种select语句的编写(join关联多表等)。

JDBC操作数据库用到的几个关键对象:

  • Connection
  • Statement
  • PrepareStatement (预编译可以提高效率等,同时可以结合批处理addbatch())
  • ResultSet

具体的使用方法查看文档即可。
当需要更好的封装JDBC进行单纯地数据库操作(而非ORM等高级对象映射),可以自己简单封装一下,不过效率肯定不能恭维(练习一下造轮子功力&封装能力即可)。

真正通用的方案是选择Apache开源库:

apache jdbc dbutils 官网给出了具体的使用示范。

轻量小乔,方便快捷。可以将resaultset转化为JavaBean,list ,map 等各种数据类型。简化了不少工作。


评论

XML摘要

1. XML简介

  1. xml是可扩展标记语言,用户可以自己定义数据。
  2. xml文档可读性良好,方便表示现实中的数据。
  3. xml在许多语言中都具有相同的接口和概念,如DOM,在javascript 和 java 中通用。
  4. 通过Parser解析器处理xml文档

2. 用途

  1. 关键将XML理解为一颗DOM Tree,操作树数据结构即可。
  2. 常用于前端和后端数据传输(json,protobuf)。
  3. ajax中利用xml异步加载部分数据,提高页面加载效率
  4. 常用作配置文件,页面布局文件(html,android)

3. 语法及规范

  1. 有且只有一个根标签
  2. 标签必须配对(可单个出现如)
  3. 严格区分大小写(html不区分)
  4. 元素可以有多个属性
  5. CDATA文本区
  6. 特殊字符需要转义

4. XML文档约束

加强xml文档的编写规范,更加清晰,严谨,可读性增强,避免不必要的错误。

能看懂了解即可,需要用时查询。

4.1 DTD约束

4.2 Schema约束


5 解析XML CRUD操作

熟练XML的增删查改

5.1 浏览器

现代浏览器都支持js,并会自动生成HTML DOM对象(符合xml),所以可以直接用js处理。

5.2 java

java内置JAXP

有两种方式:

  1. DOM :读取XML全部内容,在内存中生成一棵DOM Tree,与js接口基本相同,不过操作麻烦。
  2. SAX :基于回调函数, 按行读取方式,节省内存。

DOM4J

  • 开源库 (需要导包)
  • 支持 XPATH (关键:利用文件路径名方式遍历DOM Tree)
  • 高效快捷
  • 操作方便
  • 许多框架使用如hibernate Spring等…
评论

设计模式之单例模式

评论