数据结构-算法-源码-复习

2021预备春招面试复习大纲:Java+算法+框架+Redis+分布式(Java岗) 在开始工作至今,学习各种各样的技术之中也有很多人发现自己的很多Java的基础知识都忘了 而且越是学习越是发现Java基础的重要性,所以对于那些基础不好的可以边学边自己记载。在重新学习的时候,对这些也会有不同的感悟,将这些都记载下来,并整理成自己的笔记,对你后面你的学习也会有很大的帮助的!Kafka的速度非常快,根据ACK的级别配置,可靠性会增加,但速度会减缓。Kafka的集群自身就是高可用的,依赖Zookeeper组件,了解一些基本概念,包括ISR,能够更加详细的了解这个过程。动态规划(笔试回回有。 阅读详情
  • 最近并不是很忙,基础不能落下,不定期更新复习,会涉及Java,Python,GoLang:
  • 简单实现,有地方有错误,博客上未更改

线性表:

  • 什么是线性表:

    • 线性表指的是线性存储结构,可以理解为数组,所有数据一根线串一起,再存储到物理空间中
  • 具体实现:

    • Java

      • 参考实现:ArrayList:

      • 解析:

        • ArrayList内部有EMPTY_ELEMENTDATA 和DEFAULTCAPACITY_EMPTY_ELEMENTDATA 两个元素,连个元素的作用,及其区别: 这两个都是空数组

          • 当 使用 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的时候,意味着 默认的容量为10 
            public ArrayList() {
                    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
             }
             
             当add的时候,才会设置容量为10:
             private void ensureCapacityInternal(int minCapacity) {
                    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
             }
            
            // 计算容量
            private static int calculateCapacity(Object[] elementData, int minCapacity) {
              // 如果是默认的空数组的话,则会将容量与最小值匹配取最大值
              if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
                return Math.max(DEFAULT_CAPACITY, minCapacity);
              }
              return minCapacity;
            }
            
            
            private void ensureExplicitCapacity(int minCapacity) {
              // 用于快速失败机制
              modCount++;
            
            	// 当最小值容量大于当前元素的长度的时候就会发生扩容,并不是达到 1/2 就会扩容
              if (minCapacity - elementData.length > 0)
                grow(minCapacity);
            }
            
            private void grow(int minCapacity) {
              int oldCapacity = elementData.length;
              // 在老容量的基础上扩容 1半
              int newCapacity = oldCapacity + (oldCapacity >> 1);
              // 同时,如果扩容之后的大小超过了最大限定的话,则会再扩容到最大值:  Integer.MAX_VALUE
              if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
              if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
              // 拷贝达到扩容效果
              elementData = Arrays.copyOf(elementData, newCapacity);
            }
            
            
          • 问题:

            • 还有一个EMPTY_ELEMENTDATA,这个的作用是什么:
              • 答案: 是为了提升性能:
                • EMPTY_ELEMENTDATA在当容量为空的时候才会使用,并且在Java7中,并不存在EMPTY_ELEMENTDATA ,而只有DEFAULTCAPACITY_EMPTY_ELEMENTDATA,每当创建一个ArrayList的时候,都会发生this.elementData = new Object[initialCapacity];,所以当ArrayList实例过多的时候,内存中会存在大量的空数组,而final类型的变量都丢在常量池中,都指向同一个空数组,从而减少内存损耗
          • 总结:

            • 关于 ArrayList,add的时候才会发生扩容,通过与空数组判断相等从而判定阈值
            • 编码建议: 对于线程无关的数据,大可模仿此种做法达到内存降低(变量共享))

链表的定义:

  • 链表是一种递归的数据结构,或者为空,或者指向下一个元素

复杂度分析:

  • 查找时间复杂度: O(n): 需要遍历匹配

  • 插入的时间复杂度: O(1) 或者O(n) :

    • O(1) 表示: 插入节点的上一个节点已知,无需遍历
    • O(n)表示: 插入节点未知,需要遍历获取,再插入
  • 删除的时间复杂度同插入: O(1)或者O(n)

单向链表:

  • 什么是单向链表: 单向链表每个节点只有指针域和数据域,指针域指向下一个节点

Java实现

@Data
public class MyLinkedList<T>
{
    @Data
    class ListNode<T>
    {
        private T data;
        private ListNode<T> next;

        public ListNode()
        {
        }
    }


    private ListNode<T> head;
    private int size;


    public MyLinkedList()
    {

    }

    // 添加
    public void add(T value)
    {
        ListNode<T> listNode = new ListNode<>();
        listNode.setData(value);
        if (this.head == null)
        {
            this.head = listNode;
        } else
        {
            ListNode<T> tempNode = this.head;
            while (tempNode.next != null)
            {
                tempNode = tempNode.getNext();
            }
            tempNode.next = listNode;
        }
    }

    // 删除 节点,需要先连再断,所以需要保存上一个节点
    public void remove(T value)
    {
        ListNode<T> tempNode = this.getHead();
        while (tempNode != null)
        {
            if (null != tempNode.next && tempNode.next.getData().equals(value))
            {
                ListNode<T> prevNode = tempNode;
                prevNode.setNext(tempNode.getNext());
                tempNode.setNext(null);
                break;
            }else{
            	tempNode=tempNode.next;
            }
        }
    }

    // 查询
    public boolean contains(T value)
    {
        ListNode<T> tempNode = this.getHead();
        while (tempNode != null)
        {
            if (tempNode.getData().equals(value))
            {
                return true;
            }
            tempNode=tempNode.next;
        }
        return false;
    }
}

GoLang实现

type SingleLinkedListNode struct {
	Data interface{}
	Next *SingleLinkedListNode
}

type MySingleLinkedList struct {
	Head *SingleLinkedListNode
	Tail *SingleLinkedListNode
	Size int
}

func (this *MySingleLinkedList) Add(value interface{}) error {
	newNode := &SingleLinkedListNode{
		Data: value,
	}
	if nil == this.Head {
		this.Head = newNode
	} else {
		this.Tail.Next = newNode
	}
	this.Tail = newNode
	return nil
}

func (this *MySingleLinkedList) Remove(value interface{}) error {
	tempNode := this.Head
	for nil != tempNode {
		if nil != tempNode.Next && tempNode.Next.Data == value {
			prevNode := tempNode
			prevNode.Next = tempNode.Next
			tempNode.Next = nil
		}else{
			tempNode=tempNode.Next
		}
	}
	return nil
}

Python 实现:

  • class MySingleLinkedListNode(object):
        __slots__ = ('data', 'nextV')
    
        def __init__(self):
            self.data = None
            self.nextV = None
    
        def __str__(self):
            return 'data=%s' % self.data
    
    
    class MySingleLinkedList(object):
        __slots__ = ('head', 'tail', 'size', 'cursor')
    
        def __init__(self):
            self.head = None
            self.tail = self.head
            self.cursor = 0
            self.size = 0
    
        def add(self, value):
            newNode = MySingleLinkedListNode()
            newNode.data = value
            if self.head is None:
                self.head = newNode
            else:
                self.tail.nextV = newNode
            self.tail = newNode
            self.size += 1
    
        def remove(self, value):
            tempNode = self.head
            while tempNode is not None:
                if tempNode.next is not None and tempNode.next.data == value:
                    prevNode = tempNode
                    prevNode.next = tempNode.next
                    tempNode.next = None
                    break
                else:
                    tempNode = tempNode.next
    
        def __iter__(self):
            return self
    
        def __next__(self):
            i = 0
            tempNode = self.head
            while i < self.cursor and tempNode is not None and i < self.size:
                i += 1
                tempNode = tempNode.nextV
            if self.cursor < self.size:
                self.cursor += 1
            return tempNode
    
        def print(self):
            tempNode = self.head
            while tempNode is not None:
                print(tempNode)
                tempNode = tempNode.nextV
    
    
    mys = MySingleLinkedList()
    mys.add(1)
    mys.add(2)
    mys.print()
    for v in mys:
        if v is not None:
            print(v)
    
    

双向链表

  • 什么是双向链表: 双向链表指的是节点不仅连接着后继节点,也连接着前驱节点

Java实现:

  • 源码解析:参考LinkedList

    • LinkedList有2个成员变量:
      • transient Node first;
      • transient Node last;
    • 添加
    public boolean add(E e) {
      linkLast(e);
      return true;
    }
    void linkLast(E e) {
      final Node<E> l = last;
      final Node<E> newNode = new Node<>(l, e, null);
      last = newNode;
      if (l == null)
        first = newNode;
      else
        l.next = newNode;
      size++;
      modCount++;
    }
    
    
    • 添加采用的是尾插法,

    • 删除:

      • public E remove() {
        	return removeFirst();
        }
        public E removeFirst() {
          // 将首节点作为局部变量,减小生命周期
          final Node<E> f = first;
          if (f == null)
         	 throw new NoSuchElementException();
          return unlinkFirst(f);
        }
        private E unlinkFirst(Node<E> f) {
          final E element = f.item;
          // 保存下一个节点,这个节点作为之后的首节点
          final Node<E> next = f.next;
          f.item = null;
          f.next = null; // help GC
          first = next;
          // 如果下一个节点为空,代表着整个list为空
          if (next == null)
            last = null;
          else
            // 不是双向循环链表,所以需要将前置节点置空
            next.prev = null;
          size--;
          // 快速失败机制
          modCount++;
          return element;
        }
        
      • 删除,默认是删除的首节点

      • 删除某个下标的节点:

        • public E remove(int index) {
            checkElementIndex(index);
            return unlink(node(index));
          }
          Node<E> node(int index) {
            // assert isElementIndex(index);
          	
            // 如果下标小于一半,则从前往后
            if (index < (size >> 1)) {
              Node<E> x = first;
              for (int i = 0; i < index; i++)
                x = x.next;
              return x;
              // 否则从后往前
            } else {
              Node<E> x = last;
              for (int i = size - 1; i > index; i--)
                x = x.prev;
              return x;
            }
          }
          // 断开链接,prev需要指向cur的next ,cur的next需要指向cur的prev
          // 然后cur的next,prev全指向空
          // 唯一需要注意的就是删除的是否是头节点或者是尾节点
          E unlink(Node<E> x) {
            // assert x != null;
            final E element = x.item;
            final Node<E> next = x.next;
            final Node<E> prev = x.prev;
          
            // 删除的是首节点
            if (prev == null) {
              first = next;
            } else {
              // 将prev的next指向cur的next
              prev.next = next;
              // 断开cur的next
              x.prev = null;
            }
            // 删除的是尾节点
            if (next == null) {
              last = prev;
            } else {
              // 将next的prev指向cur的prev
              next.prev = prev;
              // 断开cur的next
              x.next = null;
            }
          
            x.item = null;
            size--;
            modCount++;
            return element;
          }
          
          
      • Java实现:

        • @Data
          public class MyDoubleLinkedList<T> implements Iterable<T>
          {
              @Override
              public Iterator<T> iterator()
              {
                  return new MyDlIterator();
              }
          
              @Data
              class DoubleLinkedListNode<T>
              {
                  private T data;
                  private DoubleLinkedListNode<T> prev;
                  private DoubleLinkedListNode<T> next;
              }
          
              private DoubleLinkedListNode<T> head;
              private DoubleLinkedListNode<T> tail;
              private int size;
          
              public void add(T value)
              {
                  DoubleLinkedListNode<T> newNode = new DoubleLinkedListNode<>();
                  newNode.setData(value);
                  linkLast(newNode);
              }
          
              private void linkLast(DoubleLinkedListNode<T> node)
              {
                  final DoubleLinkedListNode<T> tail = this.tail;
                  if (this.head == null)
                  {
                      this.head = node;
                  } else
                  {
                      tail.next = node;
                      node.prev = tail;
                  }
          
                  this.tail = node;
                  this.size++;
              }
          
              // 将数据插入到指定位置中
              public void insert(T value, int index)
              {
                  // 校验index
                  if (!this.checkIndex(index)) throw new IndexOutOfBoundsException();
                  DoubleLinkedListNode<T> newNode = new DoubleLinkedListNode<>();
                  newNode.setData(value);
                  // 插入的时候需要 获取到 插入位置的节点Cur,cur 是newNode的下一个节点,以及上一个节点prev
                  // 并不需要减1,因为node持有prev的引用
                  DoubleLinkedListNode<T> tempNode = this.head;
                  for (int i = 0; i < index; i++)
                  {
                      tempNode = tempNode.next;
                  }
                  if (null != tempNode.prev)
                  {
                      tempNode.prev.next = newNode;
                      newNode.prev = tempNode.prev;
                  }
                  newNode.next = tempNode;
                  tempNode.prev = newNode;
                  this.size++;
              }
          
              // 删除指定位置的元素
              public DoubleLinkedListNode<T> remove(int index)
              {
                  if (!this.checkIndex(index)) throw new IndexOutOfBoundsException();
                  DoubleLinkedListNode<T> tempNode = this.head;
                  for (int i = 0; i < index; i++)
                  {
                      tempNode = tempNode.next;
                  }
          
                  final DoubleLinkedListNode<T> prev = tempNode.prev;
                  final DoubleLinkedListNode<T> cur = tempNode;
                  final DoubleLinkedListNode<T> next = tempNode.next;
          
                  if (prev != null)
                  {
                      prev.next = next;
                      tempNode.prev = null;
                  }
                  if (next != null)
                  {
                      next.prev = prev;
                      tempNode.next = null;
                  }
                  this.size--;
          
                  return cur;
              }
          
              class MyDlIterator<T> implements Iterator<T>
              {
                  private int cursor;
          
                  @Override
                  public boolean hasNext()
                  {
                      return this.cursor < MyDoubleLinkedList.this.size;
                  }
          
                  @Override
                  public T next()
                  {
                      DoubleLinkedListNode<T> tempNode = (DoubleLinkedListNode<T>) MyDoubleLinkedList.this.head;
                      for (int i = 0; i < this.cursor; i++)
                      {
                          tempNode = tempNode.next;
                      }
                      this.cursor++;
                      return tempNode.data;
                  }
          
                  @Override
                  public void remove()
                  {
          
                  }
          
                  @Override
                  public void forEachRemaining(Consumer action)
                  {
          
                  }
              }
          
          
              private boolean checkIndex(int index)
              {
                  if (index < 0 || index > this.size)
                  {
                      return false;
                  }
                  return true;
              }
          
              public static void main(String[] args)
              {
                  MyDoubleLinkedList<Integer> myDoubleLinkedList = new MyDoubleLinkedList<>();
                  myDoubleLinkedList.add(1);
                  myDoubleLinkedList.add(2);
                  for (Integer integer : myDoubleLinkedList)
                  {
                      System.out.println(integer);
                  }
              }
          
      • GoLang实现:

        • type MyDoubleLinkedListNode struct {
          	Data interface{}
          	Next *MyDoubleLinkedListNode
          	Prev *MyDoubleLinkedListNode
          }
          
          type MyDoubleLinkedList struct {
          	Head *MyDoubleLinkedListNode
          	Tail *MyDoubleLinkedListNode
          	Size int
          }
          
          func (this *MyDoubleLinkedList) Add(value interface{}) error {
          	newNode := &MyDoubleLinkedListNode{
          		Data: value,
          	}
          	return this.LinkLast(newNode)
          }
          
          func (this *MyDoubleLinkedList) LinkLast(node *MyDoubleLinkedListNode) error {
          	if this.Head == nil {
          		this.Head = node
          	} else {
          		this.Tail.Next = node
          		node.Prev = this.Tail
          	}
          	this.Tail = node
          	this.Size++
          
          	return nil
          }
          
          func (this *MyDoubleLinkedList) Insert(value interface{}, index int) error {
          	if e := this.checkIndex(index); nil != e {
          		return e
          	}
          
          	newNode := &MyDoubleLinkedListNode{
          		Data: value,
          	}
          
          	// 插入到末尾
          	if index == this.Size {
          		return this.LinkLast(newNode)
          	}
          
          	tNode := this.Head
          	for i := 0; i < index-1; i++ {
          		tNode = tNode.Next
          	}
          	prev := tNode.Prev
          	next := tNode
          
          	if nil != prev {
          		prev.Next = newNode
          		newNode.Prev = prev
          	} else {
          		// 说明是首节点
          		this.Head = newNode
          	}
          	if nil != next {
          		next.Prev = newNode
          	} else {
          		// 说明是尾节点
          		this.Tail = newNode
          	}
          
          	newNode.Next = next
          	this.Size++
          
          	return nil
          }
          func (this *MyDoubleLinkedList) checkIndex(index int) error {
          	if index < 0 || index > this.Size {
          		return errors.New("index out of range ,index begin with 0")
          	}
          	return nil
          }
          func (this *MyDoubleLinkedList) Remove(index int) error {
          	if e := this.checkIndex(index); nil != e {
          		return e
          	}
          	tNode := this.Head
          	for i := 0; i < index; i++ {
          		tNode = tNode.Next
          	}
          	prev := tNode.Prev
          	next := tNode.Next
          	prev.Next = next
          	next.Prev = prev
          	tNode.Next, tNode.Prev = nil, nil
          	this.Size--
          
          	return nil
          }
          
          func (this *MyDoubleLinkedList) Foreach() {
          	tNode := this.Head
          	for nil != tNode {
          		fmt.Println(tNode.Data)
          		tNode = tNode.Next
          	}
          }
          
          
      • Python实现:

        • class MyDoubleLinkedListNode(object):
              __slots__ = ('data', 'next', 'prev')
          
              def __str__(self):
                  print('value is %s' % self.data)
          
          
          class MyDoubleLinkedList(object):
              __slots__ = ('head', 'tail', 'size')
          
              def __init__(self):
                  self.head = None
                  self.tail = None
                  self.size = 0
          
              def add(self, value):
                  newNode = MyDoubleLinkedListNode()
                  newNode.data = value
          
                  if self.head is None:
                      self.head = newNode
                  else:
                      self.tail.next = newNode
          
                  newNode.prev = self.tail
                  self.tail = newNode
                  self.size += 1
          
              def insert(self, index, value):
                  newNode = MyDoubleLinkedListNode()
                  newNode.data = value
                  self.check_index(index)
          
                  if index == self.size:
                      self.link_last(newNode)
                  else:
                      self.link_before(index, newNode)
          
              def link_last(self, node):
                  if self.head is None:
                      self.head = node
                  else:
                      node.prev = self.tail
                      self.tail.next = node
                  self.tail = node
                  self.size += 1
          
              def link_before(self, index, node):
                  i = 0
                  tNode = self.head
                  while i < index:
                      tNode = tNode.next
                      i += 1
                  prev = tNode.prev
                  if prev is not None:
                      prev.next = node
                      node.prev = prev
                  else:
                      self.head = node
                  if tNode is not None:
                      node.next = tNode
                      tNode.prev = node
                  else:
                      self.tail = node
                  self.size += 1
          
              def remove(self, index):
                  self.check_index(index)
                  i = 0
                  tNode = self.head
                  while i < index:
                      i += 1
                      tNode = tNode.next
                  prev = tNode.prev
                  next = tNode.next
                  cur = tNode
                  if prev is not None:
                      prev.next = next
                  else:
                      # 说明是头节点
                      self.head = next
                  if next is not None:
                      next.prev = prev
                  else:
                      # 说明是尾节点
                      self.tail = next
                  cur.next = None
                  cur.prev = None
                  self.size -= 1
          
              def check_index(self, index):
                  if index < 0 or index > self.size:
                      raise IndexError('index out of range')
          
              def __iter__(self):
                  itr = MyDoubleLinkedList.InternalIterator(self)
                  return itr
          
              class InternalIterator(object):
                  cursor = 0
          
                  def __init__(self, outter):
                      self.outter = outter
          
                  def __next__(self):
                      if self.cursor >= self.outter.size:
                          raise StopIteration
                      else:
                          i = 0
                          tNode = self.outter.head
                          while i < self.cursor:
                              tNode = tNode.next
                              i += 1
                      self.cursor += 1
                      return tNode
          
          
          myD = MyDoubleLinkedList()
          myD.add(1)
          myD.add(2)
          myD.add(3)
          for v in myD:
              if v is not None:
                  print(v.data)
          myD.insert(2, 4)
          for v in myD:
              print(v.data)
          
          

循环链表

程序员代码面试指南:Java算法与数据结构实战源码解析 自定义泛型数据结构时,需要考虑类型参数的约束以及如何在运行时正确处理类型。Java中可以通过继承Comparable接口来实现泛型类的排序。下面是一个简单的泛型链表实现示例:T data;} else {= null) {= null) {= null) {泛型链表的sort方法使用了简单的冒泡排序来对链表进行排序。由于泛型的使用,可以保证排序过程中数据类型的正确性。 阅读详情

相关推荐

基于大模型的恶性胸腔积液全周期预测与诊疗方案研究

本研究基于大模型技术构建了恶性胸腔积液全流程预测与诊疗体系,涵盖术前风险评估、术中方案优化、术后恢复预测及并发症预防。通过整合多源医疗数据,实现了手术风险概率预测(准确率80%)、并发症预警(AUC值0.85)及个性化康复方案制定,显著提升诊疗精准度。研究创新性地将Transformer架构与多模态数据融合,在100例临床验证中显示良好性能,但存在数据样本局限、模型可解释性不足等问题。未来将扩大多中心临床验证,优化算法可解释性,探索与基因检测等技术的结合应用,推动恶性胸腔积液的精准诊疗发展。

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1897

《数据结构与算法》讲透了,带源码笔记

开篇数据结构是计算机科学与技术专业非常重要的一门核心基础课,计算机科学各个领域以及各种应用软件都要使用相关的数据结构和算法。本篇的主要目的不是提供关于数据结构和算法的定理及证明。本书采用的模式是利用不同的复杂度改善问题的解决(对于每个问题,你将发现多个具有不同复杂度及降低复杂度的解法)。基本上,这一思路就是列举某个问题的所有可能性。通过这种方式,即使你遇到一个新问题,它也能够向你指明如何思考该问题所有可能的结果。对于正在准备面试、参加选拔性考试以及校园面试的读者很有帮助。本篇关于数据结构与算法所讲到的所有问

代码界的扛把子 245

VMD-CNN-BiLSTM-Attention预测模型 —— 数学模型介绍&完整实例代码

想解决电力负荷预测中的非线性、非平稳难题?这篇博客介绍了一种创新混合模型,结合变分模态分解(VMD)和CNN-BiLSTM-Attention深度学习架构,实现超高精度预测! ✨ 核心亮点: ✅ VMD分解:有效分离复杂负荷信号,提取关键频率特征 ✅ 混合深度学习:CNN捕捉局部模式 + BiLSTM学习长时序依赖 + 注意力机制聚焦关键时段 ✅ 端到端优化:从数据预处理(滑动窗口、归一化)到模型训练(MSE损失+Adam优化),完整流程公开! ✅ 工业级评估:提供MSE、MAE、MAPE、R²多指标验证

qq_42924330的博客 1652

数据结构课程设计算法源码

数据结构课程设计源代码 目录数据结构课程设计源代码实验一:图书信息管理系统的设计与实现实验二:隐式图的搜索问题实验三:基于二叉排序树的低频词过滤系统 实验一:图书信息管理系统的设计与实现 #include <cstdio> #include <cstring> #include <iostream> using namespace std; #define MAXSIZE 100 #define OK 1 #define ERROR 0 typedef struct {

qq_52942550的博客 1019

40-基于STM32与LD3320的智能语音调光台灯开发全攻略(代码+硬件+调试心得)

本文详细介绍了基于STM32与LD3320的智能语音调光台灯开发全攻略,包括硬件设计、软件实现和调试心得。项目利用STM32单片机控制LD3320语音识别模块,实现语音控制开关和PWM调光功能,适合非接触式操作场景。文章还分享了硬件选型、PWM调光算法优化及常见问题解决方案,为开发者提供完整参考。

weixin_29163797的博客 325

ArcGIS高效拆分shp文件:无需依赖属性表的实用技巧

本文针对ArcGIS中shp文件因属性表缺失而难以拆分的问题,详细介绍了无需依赖属性表的实用技巧。核心是使用“拆分多部件要素”工具,直接根据图形结构将多个独立但被合并的部件拆分为单个要素,并提供了ArcGIS Pro和ArcMap的操作流程、关键注意事项及拆分后的属性处理方案。

n2o3p4的博客 376

android什么意思?Android岗面试12家大厂成功跳槽,Android校招面试指南

在做android项目开发时,大家都知道如果程序出错了,会弹出来一个强制退出的弹出框,这个本身没什么问题,但是这个UI实在是太丑了,别说用户接受不了,就连我们自己本身可能都接受不了。虽然我们在发布程序时总会经过仔细的测试,但是难免会碰到预料不到的错误。今天就来自定义一个程序出错时的处理,类似iphone的闪退。(虽然闪退也是用户不愿意看到的,但是在用户体验上明显比那个原生的弹窗好多了)

2401_89722372的博客 992

PCB设计之ODB++文件格式详解

ODB++(Open Database++)是一种广泛应用于PCB(印制电路板)设计和制造领域的开放数据交换格式。它由Valor Computerized Systems(现为Siemens EDA的一部分)开发,旨在替代传统的Gerber文件格式,提供更完整、结构化的制造数据,从而优化PCB设计到生产的流程。ODB++通过结构化数据整合了PCB设计到制造的全流程信息,显著提高了生产效率和准确性。尽管存在一定的兼容性挑战,但其在复杂项目和高可靠性场景中的价值不可替代。

ZZcppc的博客 1万+

《数据结构与算法Python语言描述》裘宗燕 笔记 第六章 二叉树和树

《数据结构与算法Python语言描述》裘宗燕 笔记系列该系列笔记结合PPT的内容整理的,方便以后复习,有需要的朋友可以看一下。源码重新整理了地址:https://github.com/StarsAaron/DS/tree/master...

繁星点点~ 311

利用autojs制作抢购支付宝消费劵的手机脚本

前期准备工作 1.打开支付宝,点击中间的抢消费券的广告 2.点击左上角,将抢购页面添加到首页 3.查看支付宝首页是否出现消费劵 . autojs代码 "auto"; functiontaskstart(){ sleep(1000); launchApp('支付宝'); toast("正在打开支付宝应用"); sleep(1000); varxf=textContains("消费").findOne().bounds(); ...

洛阳泰山的博客 1万+

MIMIC数据库简介

一 、MIMIC简介 MIMIC(Medical Information Mart for Intensive Care),是一个大型的公开数据库。该数据库记录了2001年至2019年期间贝斯以色列女狄肯斯医疗中心重症监护病房患者的相关数据,拥有4万多名患者的医疗健康数据和记录。 MIMIC数据库记录了人口统计学信息,如病人的性别、身高、宗教等情况。记录了实验室检验信息,如血常规,肝功能,肾功能等实验室检测数据。记录了患者的用药信息,如高血压患者服用了治疗高血压类药物等。记录了护理人员以及患者的护理级别等。

越努力 越幸运 1万+

由浅入深!面试字节跳动的Android工程师该怎么准备?文末领取面试资料

前言 前面一篇文章分享了最近整理的大家伙的面试经历总结,有兴趣可以去翻看一下。这位去百度面试的小A同学的面试经历很有趣,因为他拿到了offer但是并没有去,在了解原因后挺认同他的想法的。这种职业价值观我觉得对很多人非常有参考意义。 面试复习路线图 我之前复习,大多都在20点以后,因为晚上比较能集中注意力,制定一个学习计划,切勿零散的复习,最好是系统的复习,才能胜却在握 主要内容如下: BAT的面试题目相关 性能优化相关相关 多线程相关 Java相关 源码解析相关 网络编程相关 算法合集相关 数据结构相

clhcowboy的博客 231

AI应用架构师收藏:大规模AI系统AIOps智能运维的4个落地案例

本文精选互联网、金融、制造、电信四大行业的大规模AI系统AIOps落地案例,覆盖云原生AI平台、风控AI系统、工业AI质检、5G网络AI优化等典型场景。行业背景与系统规模:业务目标、AI系统架构、运维挑战;AIOps解决方案设计:数据采集层→分析层→决策层的全栈架构,技术栈选型与理由;核心技术实现细节:异常检测算法、根因分析模型、自动化恢复流程(含Python代码示例);实施效果与经验总结:关键指标对比、踩坑教训、架构师视角的最佳实践。

AI天才研究院 852

android绘制流程,《Android面试题及解析》分享给大家

我之前复习,大多都在20点以后,因为晚上比较能集中注意力,制定一个学习计划,切勿零散的复习,最好是系统的复习,才能胜却在握。简历上写的项目,仔细认真的过一遍。还有就是关于业务的一些深层次的东西,得好好思考一下。一些开放性问题还是需要好好思考一下,顺便也准备一下 HR 面可能会问到的一些问题。在复习某个部分时可能会引出其它知识点,如果也不是很清楚的话也需要系统的再复习一下。知识体系比较广并且发展迅速,要注重基础。

2401_84412069的博客 839

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java知识复习快速导航(超详细)

Java复习快速导航(建议收藏) 1. Java基础 Java基础必背知识点 Java基础加强知识点 JavaWeb 1 (mysql、HTML、js、xml) JavaWeb 2 (tomcat、cookie、el、filter) JavaWeb 3 (jquery、ajax、json、redis) maven 2. Java提高 redis dubbo 并发JUC jvm 阻塞队列、线程池 NIO Netty 数据库 RabbitMQ MongoDB 集群 3. 框架 spring mybatis

yangyang975的博客 405

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

大二下第九周

这一周主要准备了面试,我之前的重心主要是放在vue源码和算法上边了,基本就是来到小组第一件事就是打开力扣,虽然有时候一道题做俩小时也做不出来,然后就是去看vue源码,我做事喜欢把这件事做好至少做完再去干下一件事,因此在vue源码上我花费了很长时间,复习HTML、CSS和JS大概是从周三晚上才开始的,那个时候其实已经有人面试完了,我在牛客上找的面经,感觉还不错,面试完的同学在群里说的学长学姐问的东西我在那个面经里基本上都看到了,评论区也有很多指正补充的,然后就看那个面经,总结的真的很不错,我觉...

每一步的地方,每一站都不会忘。 1492

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android面试简历模板,,字节跳动今日学习内容

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门。

2401_83411843的博客 608

android编程权威指南第4版,,面试官必问的技术问题之一

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!Android前沿技术大纲全套体系化高级架构视频Android高级架构资料、源码、笔记、视频。

2401_83704218的博客 1093

【C语言】停车场管理系统丨源码+解析

本文完整实现了基于栈+队列的停车场管理系统,包含详细源码和逐行解析,特别适合复习数据结构与算法综合应用

C语言实战大全 779

史上最全 Android 中高级工程师面试复习大纲

概述 都说金三银四青铜五,这几个月份是程序员最好的跳槽时间,笔者四月初也换了工作。找工作之前看了很多面试题,复习资料,但是发现纯看面试题是不行的,因为靠背的东西是记不牢的,需要知识成体系才可以,所以笔者整理了一份复习大纲,基本涵盖了 Android 中高级工程师面试所必须知识点,希望可以通过此文帮助一些想换工作的朋友更好的复习,准备面试。 本文只罗列出大纲内容,至于每个模块的详细内容,网上很多资料...

weixin_34414196的博客 510

非常全面的Android 中高级工程师面试复习大纲

概述 都说金三银四青铜五,这几个月份是程序员最好的跳槽时间,笔者四月初也换了工作。找工作之前看了很多面试题,复习资料,但是发现纯看面试题是不行的,因为靠背的东西是记不牢的,需要知识成体系才可以,所以笔者整理了一份复习大纲,基本涵盖了 Android 中高级工程师面试所必须知识点,希望可以通过此文帮助一些想换工作的朋友更好的复习,准备面试。 本文只罗列出大纲内容,至于每个模块的详细内容,网上很多资料...

Android_SE的博客 562

金九银十Android中高级程序员该如何复习?全网最全Android 中高级工程师面试复习大纲(建议收藏)

前言 博主双非本科毕业,五年的Android开发经验,最近准备跳槽,正好赶上金九银十,都说金九银十,这几个月份是程序员最好的跳槽时间, 找工作之前看了很多面试题,复习资料,但是发现纯看面试题是不行的,因为靠背的东西是记不牢的,需要知识成体系才可以,所以笔者整理了一份复习大纲,基本涵盖了 Android 中高级工程师面试所必须知识点,希望可以通过此文帮助一些想换工作的朋友更好的复习,准备面试。 注:本文只罗列出大纲内容,至于每个模块的详细内容,需要的下方获取。 1、Java 相关 容器(H.

hcskhksa的博客 1645

走过路过不要错过,面了六轮才拿到阿里Android研发岗的Offer,确定不来看看?

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2020-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。还有高级架构技术进阶脑图、高级进阶架构资料帮助大家学习提升进阶,这里我也免费分享给大家也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。一起互勉~视频和PDF(知识脉络 + 诸多细节)。还有高级架构技术进阶脑图、高级进阶架构资料。

2401_86964022的博客 847

flutter跳转第三方应用,Android工程师最容易遇到4个瓶颈是什么

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

2401_83601703的博客 701

iOS复习安排

2017.7.22 复习下 TableView 解耦方式。更轻量的 View Controllers 复习下二叉树数据结构,刷5道算法题。 复习下TCP/UDP相关知识,看下CocoaAsyncSocket源码。

pelsor的专栏 727

遇到瓶颈如何提升自己?Android 最全知识体系总结及学习路线分享给你!(1)

制定好学习计划,持之以恒的坚持!

2401_84558442的博客 1067
上一篇: 环境搭建
下一篇: 文本-图片-视频-相似度算法-demo
Coder_Joker
博客等级 码龄8年 39粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值