没有合适的资源?快使用搜索试试~ 我知道了~
本文档提供了一系列经典的编程挑战题解析和实战训练,涵盖数据结构(如链表、栈、队列、二叉树)、搜索技巧(如查找、旋转数组)、动态规划等问题。具体包含了二维数组中的查找、字符串处理、链表管理、矩阵计算等多个实用实例的学习与应用,旨在帮助读者逐步掌握核心算法技能及其工程实现能力,适用于不同层次程序员提高自身技术水平的需求。 适合人群:初级和中级水平的数据开发者和研究人员,有一定编程基础的工作1年以上的软件工程师。 应用场景及目标:用于日常工作中涉及的各种搜索、排列组合、链表操作以及其他需要高效运算的问题情境下的工具性使用。 阅读提示:每个题目附带源码讲解与执行,通过实践理解各个知识点的实际运用,加深理论记忆的同时加强动手能力,从而能够独立快速解决问题。
资源推荐
资源详情
资源评论
《算法编程从入门到精通》系列分享专栏
简介
追求进步系列,每天三个算法,从简单到复杂,不断地提高编程技术,题目来源剑指offer,以及程序猿面试指南等算法题目。
文章
【追求进步】二维数组中的查找
【追求进步】替换空格
【追求进步】从尾到头打印链表
【追求进步】重建二叉树
【追求进步】用两个栈实现队列
【追求进步】旋转数组的最小数字
【追求进步】斐波那契数列
【追求进步】跳台阶
【追求进步】变态跳台阶
【追求进步】矩形覆盖
【追求进步】二进制中1的个数
【追求进步】数值的整数次方
【追求进步】调整数组顺序使奇数位于偶数前面
【追求进步】和为S的两个数字
【追求进步】第一个只出现一次的字符位置
【追求进步】孩子们的游戏(圆圈中最后剩下的数)【百度阿里面试常考算法之一】
【追求进步】反转链表
【追求进步】合并两个排序的链表
【追求进步】树的子结构
【追究进步】二叉树的镜像
【追求进步】二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数
组中是否含有该整数。输入描述输入描述:
array: 待查找的二维数组
target:查找的数字
输出描述输出描述:
查找到返回true,查找不到返回false
代码:public class Solution {
/*规律:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束:
* 如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行。
* 也就是说如果要查找的数字不在数组的右上角,则每-次都在数组的查找范围中剔除)行或者一列,这样每一步都可以缩小
* 查找的范围,直到找到要查找的数字,或者查找范围为空。 */
public boolean Find(int [][] array,int target) {
//先判断边界条件
if(array==null||array.length<1||array[0].length<1){
return false;
}
int rows=array.length;//数组的行数
int clos=array[1].length;//数组的列数
int row=0;//起始行号
int clo=clos-1;//起始列号
// 要查找的位置确保在数组之内
while(row>=0 && row<rows&& clo>=0&& clo<clos){
if(array[row][clo]==target){//如果找到了就返回
return true;
}else if(array[row][clo]>target){//如果当前数大于要找的数,则要找的数肯定在当前数所在的列的前面
clo--;
}else{
row++;
}
}
return false;
}
}
【追求进步】替换空格
题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
代码实现:
public class Solution {
public String replaceSpace(StringBuffer str) {
/*
//判断输入是否合法
if(str==null||str.length<uselength){
return -1;
}
//计算替换的空格数量
int whitecount=0;
for(int i=0;i<uselength;i++){
if(str[i]== ' '){
whitecount++;
}
}
//计算替换后字符串的长度
int targetlength=whitecount*2+uselength;
int tmp=targetlength;
if(targetlength>str.length){
return -1;
}
if(whitecount==0){
return uselenght;
}
uselength--;
targetlength--;
while(uselength>=0&&uselenght<targetlength){
//如果当前字符串中从后向前存在空格,则替换为%20
if(str[uselength]== ' '){
str[targetlength--]='0';
str[targetlength--]='2';
str[targetlength--]='%';
}else{
str[targetlength--]=str[uselength];
}
uselength--;
}
return tmp;
}*/
String sti = str.toString();
char[] strChar = sti.toCharArray();
StringBuffer stb = new StringBuffer();
for(int i=0;i<strChar.length;i++){
if(strChar[i]==' '){
stb.append("%20");
}else{
stb.append(strChar[i]);
}
}
return stb.toString();
}
}
【追求进步】从尾到头打印链表
题目描述
输入一个链表,从尾到头打印链表每个节点的值。
输入描述输入描述:
输入为链表的表头
输出描述输出描述:
输出为需要打印的“新链表”的表头
代码如下:
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
import java.util.ArrayList;
import java.util.Stack;//天哪,为了引包,我花费了1个小时找不到问题,就说怎么用不了stack呢,真的好傻啊
public class Solution {
//输入个链表的头结点,从尾到头反过来打印出每个结点的值 使用栈的方式进行
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
/* Stack<Integer> stack=new Stack<Integer>();
//边界判断
if(listNode==null){
ArrayList list=new ArrayList();
return list;
}
//Stack<Integer> stack = new Stack<Integer>();
while(listNode!=null){
stack.push(listNode.val);
listNode=listNode.next;
}
ArrayList<Integer> arrlist=new ArrayList<Integer>();
while(!stack.isEmpty()){
arrlist.add(stack.pop());
}
return arrlist;
}*/
Stack<Integer> stack=new Stack<Integer>();
while(listNode!=null){
stack.push(listNode.val);//入栈
listNode=listNode.next;
}
ArrayList<Integer> list=new ArrayList<Integer>();
while(!stack.isEmpty()){
list.add(stack.pop());//出栈放在数组中
}
return list;
}
}
【追求进步】重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍
历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
在线代码:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode root= reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
return root;
}
private TreeNode reConstructBinaryTree(int [] pre,int startPre,int endPre,int [] in,int startIn,int endIn) {
if(startPre>endPre||startIn>endIn)
return null;
TreeNode root=new TreeNode(pre[startPre]);
for(int i=startIn;i<=endIn;i++)
if(in[i]==pre[startPre]){
root.left=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
root.right=reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
}
return root;
}
}
代码详细解释:
剩余23页未读,继续阅读
资源评论
天涯学馆
- 粉丝: 1978
- 资源: 346
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功