近期准备抽出一点时间,刷一些题防止手生,毕竟codemonkey,吃饭的手艺不能忘。

·······································

基本的题目都是基于java语言解答的,周末最近喜欢上了比赛赢积分,要求时间和准确率。在具体题的前面,增加一下常用的

java数据结构,及快速解决方法。目标,快速AC简单问题

~~堆栈的使用

//字符串提取常用
s.charAt(i);
//大小写转换
s.toUpperCase()
s.toLowerCase()
s.substring(i,j);//截取[i,j]的子字符串
char[] arr = str.toCharArray();//转数组
String string =String.copyValueOf(arr); //转字符串
new String(arr);
String.trim() //去首尾空格
str.replace(" ", ""); .//去所有空格
String s[] = str.split(" ");//分割字符串为字符数组
StringBuffer sb = new StringBuffer();
sb.append(c);//string不存在append方法,借助 StringBuffer实现
sb.reverse();//字符串反转
sb.deleteCharAt(pos);//删除制定位置的字符
//字符串转int
Integer.parseInt(s)//默认十进制解析
Integer.parseInt (s,2)// 二进制解析字符串
//判断int数字是否溢出
Integer.MAX_VALUE
Integer.MIN_VALUE
//数组拷贝
//(原数组, 原数组的开始位置, 目标数组, 目标数组的开始位置, 拷贝个数)
int[] a1 = {1, 2, 3, 4, 5};
int[] a2 = new int[10];
System.arraycopy(a1, 1, a2, 3, 3);//// [0, 0, 0, 2, 3, 4, 0, 0, 0, 0] //Stack的简单使用
Stack<Character> stack = new Stack<Character>();
char b = stack.peek();
char c = stack.pop();
stack.add();
stack.empty();
//hashset使用
HashSet hs;
hs.add();//成功加入返回true
//快速表达式,简单的判断赋值,一行解决
a=b?b-a:a-b;
//计算函数是否符合为被二余数时,使用位操作更快
a&1 = 1; //Array转List
ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array));

HashMap 使用键值对的时候可以使用,自带排序的TreeMap但是调用的时候稍微有点麻烦

TreeMap tp = new TreeMap();
Set<Integer> set = tp.keySet();
Interator<Integer> itor = set.interator();
int key = itor.next();
tp.get(key); 
//快速遍历hashMap
  Map map = new HashMap();
  Iterator iter = map.entrySet().iterator();
  while (iter.hasNext()) {
  
Map.Entry entry = (Map.Entry) iter.next();
  
Object key = entry.getKey();
  
Object val = entry.getValue();
  }

tips:单链表查询有环问题,设计快慢指针,相遇则为有环。进一步,找到入环第一个节点,快慢指针相遇,路程差为头指针到交点距离。

简单队列:

Queue<String> q =new  LinkedList<String>();
q.offer("a"); //添加元素
q.peek();//查看队首,不弹出
q.poll();//查看并弹出队首
q.element();//查看队首,不弹出,空时不报错

格雷编码快速生成:

  格雷编码相邻数字仅有一位相差,可以通过位移方式快速形成

/**
关键是搞清楚格雷编码的生成过程, G(i) = i ^ (i/2);
如 n = 3:
G(0) = 000,
G(1) = 1 ^ 0 = 001 ^ 000 = 001
G(2) = 2 ^ 1 = 010 ^ 001 = 011
G(3) = 3 ^ 1 = 011 ^ 001 = 010
G(4) = 4 ^ 2 = 100 ^ 010 = 110
G(5) = 5 ^ 2 = 101 ^ 010 = 111
G(6) = 6 ^ 3 = 110 ^ 011 = 101
G(7) = 7 ^ 3 = 111 ^ 011 = 100
**/
List<Integer> ret = new ArrayList<>();
for(int i = 0; i < 1<<n; ++i)
ret.add(i ^ i>>1);
public static void sort(int[][] ob, final int[] order) {
Arrays.sort(ob, new Comparator<Object>() {
public int compare(Object o1, Object o2) {
int[] one = (int[]) o1;
int[] two = (int[]) o2;
for (int i = 0; i < order.length; i++) {
int k = order[i];
if (one[k] > two[k]) {
return 1;
} else if (one[k] < two[k]) {
return -1;
} else {
continue; //如果按一条件比较结果相等,就使用第二个条件进行比较。
}
}
return 0;
}
});
}

二维数组排序

Deque实现队列,栈的操作。get,remove,peek,poll可选择first or last

package com.yulore.ex;

import java.util.ArrayDeque;
import java.util.Deque; public class DequeTest { /**
* @param args
*/
public static void main(String[] args) {
Deque<Integer> mDeque = new ArrayDeque<Integer>(); for(int i=0;i<5;i++){
mDeque.offer(i);
} System.out.println(mDeque.peek()); System.out.println("***********集合方式遍历**********"); //集合方式遍历,元素不会被移除
for (Integer x : mDeque) {
System.out.println(x);
} System.out.println("**********遍历队列*************"); //队列方式遍历,元素逐个被移除
while (mDeque.peek() != null) {
System.out.println(mDeque.poll());
} System.out.println("***********进栈操作************"); mDeque.push(10);
mDeque.push(15);
mDeque.push(24);
print(mDeque); System.out.println("*********出栈操作*************"); System.out.println(mDeque.pop());
} public static void print(Deque<Integer> queue){
//集合方式遍历,元素不会被移除
for (Integer x : queue) {
System.out.println(x);
}
}
}

示例代码

PriorityQueue 具有优先级的基于优先级堆的极大优先级队列

public static void main(String[] args){
PriorityQueue<webs> pq = new PriorityQueue<webs>(3,new Comparator<webs>(){
@Override
public int compare(webs o1, webs o2) {
return o1.n - o2.n;
}
});
webs a = new webs(1);
webs b = new webs(2);
webs c = new webs(4);
webs e = new webs(0);
webs d = new webs(5);
pq.add(a);
pq.add(d);
pq.add(c);
pq.add(e);
pq.add(b);
while(!pq.isEmpty()){
Iterator<webs> ite = pq.iterator();
while(ite.hasNext()){
webs aa = ite.next();
System.out.println(aa.n);
}
webs tmp = pq.poll();
System.out.println(tmp.n+"-----------------");
}

优先级队列

-----分割线-----------

动态规划:

分解当前状态和之前状态的关系,基本通过二维数组迭代实现,进阶可使用一维数组

--------------------------------------分割线-----------------------------------------

  简单记录下解题时的想法和遇到的坑,如果能坚持下来以后可能还会整理整理,sasa。

1,用链表计算计算加法  Add Two Numbers

  对于科班出身的人对面向对象的概念都很简单,然而在实际的编程中,由于封装的原因,要考虑到各种奇葩的输入,防止你的程序异常崩溃。

回到题目,例子中给的是342+465 =807;在最开始要考虑链表是否为空的情况,在函数最开始进行判断。然后依次相加进位,输出结果。

注意:坑是在相加之后产生的进位可能会影响很多高位,例如1+999; 这种情况很容易被遗漏;

技巧:

对于本菜鸟来说,开始的时候在初始化队列头部时写的麻烦了。单独对头部进行相加之后才进入循环,因为直接进入循环处理不好实例化ListNode的时间。

然而在看过参考答案之后,为了不对头部单独进行判断,可以设置无意义的head节点,最终返回的时候return head.next;

还可以通过判断指针为空的方法,将不一样的长度的链表相加在一个while循环中计算,最后上代码:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0;
while (p != null || q != null) {
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = carry + x + y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}

  2,计算最长不重复子链长度 Longest Substring Without Repeating Characters

  对于给定字符串,计算其中最长不重复子链的长度,比如abcabcbb,最长是abc,返回值是 3.

  解决思想,字符串转字母数组,从头开始遍历,遍历到的字母最为key值加入map,value存储字母在字符串中的位置;如果key值重复,判断当前map的size是为max然后移除map中重复项及其前面的字母,加入新的字母,直到遍历结束。

  易忽略点:1,当字符串为单个字母的情况容易判断错误,未及时更新max值

        2,移除重复项的过程要记录上次移除到何处位置,否则会导致重复移除

  public int lengthOfLongestSubstring(String s) {

         int maxLongth = 0;
int startPosition = 0;
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
char[] get = s.toCharArray();
for(int i=0;i<get.length;i++){
if (map.containsKey(get[i])) {
if (map.size()>maxLongth)
maxLongth =map.size();
int removeNum = map.get(get[i]);
for (int j = startPosition; j <= removeNum; j++)
map.remove(get[j]);
startPosition= removeNum+1;
}
map.put(get[i],i);
}
if (map.size()>maxLongth)
return map.size();
return maxLongth;
}

3,给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。

找到所有在 [1, n] 范围之间没有出现在数组中的数字。

您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

提示:本题在于对时间复杂度和空间的限制,利用全部为正整数的性质,并且与数组下标对应,可以通过负数的形式,解决该问题

class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> list= new ArrayList<Integer>();
for(int i=0;i<nums.length;i++){
int val = Math.abs(nums[i])-1;
nums[val] =-Math.abs(nums[val]);
}
for(int i=0;i<nums.length;i++){
if(nums[i]>0)
list.add(i+1);
}
return list;
}
}

LeetCode算法题 菜鸟总结的更多相关文章

  1. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  2. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  3. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

  4. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  5. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  6. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

  7. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

  8. LeetCode算法题-Jewels and Stones(Java实现)

    这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...

  9. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

随机推荐

  1. Nginx 反向代理(http转htpps,并支持80端口继续提交post请求)

    项目是一个web server + 多个client的形式,client由用户安装在自己的电脑上 由http升级为https后,我们通过在Nginx做了80端口重定向443的配置,使用户通过访问htt ...

  2. Java的接口(interface)属性和方法的类型

    接口的属性必须是public static final Type 接口的方法必须是public abstract Type 不管你是全写,或只写部分,系统都会自动按上面的要求不全 也就是说 接口中 所 ...

  3. vue中过滤器比较两个数组取相同值

    在vue中需要比较两个数组取相同值 一个大数组一个 小数组,小数组是大数组的一部分取相同ID的不同name值 有两种写法,两个for循环和map写法 const toName = (ids, arr) ...

  4. 虹软人脸识别在 linux中so文件加载不到的问题

    其实是可以加载到的,不过是so文件放的位置不一对,最简单的方式是放在 /usr/lib64 目录下,也可自己设置. so文件加载不到会报这个错误:    .lang.UnsatisfiedLinkEr ...

  5. CUBA Platform —— 开源的、可靠的企业级应用开发利器

    原文:CUBA Platform: An Open-Source Java Framework for Rapid Application Development 翻译:CUBA China CUBA ...

  6. 仿淘宝商品详情页上拉弹出新ViewController

    新项目就要开始做了,里面有购物那块,就试着先把淘宝商品详情页的效果做了一下. 1.需求 1.第一次上拉时,A视图拉到一定距离将视图B从底部弹出,A视图也向上 2.显示B视图时下拉时,有刷新效果,之后将 ...

  7. 20个专业H5(HTML5)动画工具推荐

    AnimateMate 可能是最好的 Sketch 动画插件.Sketch 目前被广泛应用于 HTML5 的原型界面设计,或者被应用于数据可视化的,动画部分则一般经由软件 Principle 等实现. ...

  8. [转]SAPUI5 (01) - OpenUI5环境搭建

    本文转自:http://blog.csdn.net/stone0823/article/details/53750094 版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn ...

  9. 阿里巴巴Java开发规约插件使用

    10月14日上午9:00 阿里巴巴于在杭州云栖大会<研发效能峰会>上,正式发布<阿里巴巴Java开发手册>扫描插件,该插件在扫描代码后,将不符合<手册>的代码按Bl ...

  10. SSM实现图片上传管理操作

    Spring MVC 实现文件上传 时序图 利用 Spring MVC 实现文件上传功能,离不开对 MultipartResolver 的设置.MultipartResolver 这个类,你可以将其视 ...