二维数组中的查找

问题描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路

纵向从下往上开始遍历第一列,数值相等直接返回;小于n从上一行开始循环判断,大于n判断本行,相等则返回,没有则继续循环。

    public void searchN(int n) {if (nums.length == 0) return;for (int i = nums.length - 1; i >= 0; i--) {if (nums[i][0] == n) {System.out.println("x=" + (nums.length - i + 1) + " y=" + 0);return;} else if (nums[i][0] < n) {continue;} else {for (int j = 0; j < nums[i].length; j++) {if (nums[i][j] == n) {System.out.println("x=" + (nums.length - i + 1) + " y=" + j);return;}}}}}
复制代码

替换空格

问题描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路

将字符串转成char数组逐个遍历,或直接遍历字符串,使用StringBuilder构建新字符串。

    public String replace(String str) {StringBuilder builder = new StringBuilder();char[] chars = str.toCharArray();for (char c : chars) {if (c == ' ') {builder.append("%20");} else {builder.append(c);}}return builder.toString();}
复制代码

从尾到头打印单链表

问题描述

将单链表元素从尾到前逆序打印

解题思路

创建Stack栈,从前向后遍历单链表,完成后依次弹栈。

    public void printWithStack(LinkNode node) {if (node == null) return;// 将链表节点依次压栈Stack<LinkNode> stack = new Stack<>();stack.push(node);while (node.next != null) {stack.push(node.next);node = node.next;}// 将栈内元素依次弹栈while (!stack.isEmpty()) {System.out.println(stack.pop().value);}}
复制代码

两个栈实现队列

问题描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

解题思路

两个栈 stack1 和 stack2:

push 动作都在 stack1 中进行,

pop 动作在 stack2 中进行。当 stack2 不为空时,直接 pop,

当 stack2 为空时,先把 stack1 中的元素 pop 出来,push 到 stack2 中,再从 stack2 中 pop 元素。

    class MyQueue {Stack<Integer> stack1 = new Stack<>();Stack<Integer> stack2 = new Stack<>();public void push(Integer integer) {stack1.push(integer);}public Integer pop() {if (stack1.isEmpty() && stack2.isEmpty()) {throw new NullPointerException();}while (!stack1.isEmpty()) {stack2.push(stack1.pop());}Integer i = stack2.pop();while (!stack2.isEmpty()) {stack1.push(stack2.pop());}return i;}}
复制代码

旋转数组的最小值

问题描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。

例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

NOTE:给出的所有元素都大于0,若数组大小为0,请返回0

解题思路

类似于二分查找,定义左右两个指针left,right,计算中间指针位置mid

1、如果中间值>右边值,说明最小值在右半部分,left右移到mid+1

2、如果中间值=右边值,right左移一位,缩小距离

3、如果中间值<有右边值,说明最小值在左半部分,right更新为mid

    public int search(int[] nums) {if (nums == null || nums.length == 0) return 0;int left = 0;int right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] > nums[right]) {left = mid + 1;} else if (nums[mid] == nums[right]) {right = right - 1;} else {right = mid;}}return nums[left];}
复制代码

斐波那契数列

问题描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39

类似青蛙跳台阶问题。

解题思路

公式: f(n) = n, n <= 1 f(n) = f(n-1) + f(n-2), n > 1

  • 递归
    public int method1(int n) {if (n == 0 || n == 1) return n;return method1(n - 1) + method1(n - 2);}
复制代码
  • 动态规划
    public int method2(int n) {if (n == 0 || n == 1) return n;int f1 = 0;int f2 = 1;for (int i = 2; i <= n; i++) {f2 = f2 + f1;f1 = f2 - f1;}return f2;}
复制代码

二进制中1的个数

问题描述

输入一个自然数,输出该数二进制表示中1的个数。

解题思路

将自然数转为二进制数,遍历新字符串。

    public int fun(int n) {String binary = "";while (n != 0) {binary = n / 2 + binary;n = n % 2;}char[] chars = binary.toCharArray();if (chars == null || chars.length == 0) return 0;int count = 0;for (char c : chars) {if (c == 1) count++;}return count;}
复制代码

调整数组奇偶数位置

问题描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解题思路

  • 创建两个集合分别放入奇数和偶数,再合至一起
    public void method1(int[] nums) {if (nums == null || nums.length == 0) return;ArrayList<Integer> ji = new ArrayList<>();ArrayList<Integer> ou = new ArrayList<>();for (int i : nums) {if (i % 2 != 0) {ji.add(i);} else {ou.add(i);}}ji.addAll(ou);for (int i = 0; i < ji.size(); i++) {nums[i] = ji.get(i);}System.out.println(Arrays.toString(nums));}
复制代码
  • 类似于冒泡排序
    public void method2(int[] nums) {if (nums == null || nums.length == 0) return;for (int i = 0; i < nums.length; i++) {for (int j = 0; j < nums.length - i - 1; j++) {if (nums[j] % 2 == 0 && nums[j + 1] % 2 != 0) {int temp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = temp;}}}System.out.println(Arrays.toString(nums));}
复制代码

数值的整数次方

问题描述

给定一个double类型的浮点数base和int类型的整数n。求base的n次方。

解题思路

循环自乘,但需对特殊数值进行处理。

    public double square(double base, int n) {// 任何数的0次幂都是1if (n == 0) {return 1;}// 指数小于0,先求其相反数幂次,最后求倒if (n < 0) {// 底数为0时特别处理if (base == 0) {throw new RuntimeException("0没有负数次幂");} else {double result1 = power(base, -n);return 1 / result1;}}return power(base, n);}/*** 求幂** @param base* @param n* @return*/public double power(double base, int n) {if (n == 0) return 1;double result = 1;for (int i = 1; i <= n; i++) {result = result * base;}return result;}
复制代码

转载于:https://juejin.im/post/5c8f3e6f6fb9a07100164d37

剑指offer java版(一)相关推荐

  1. 剑指offer java版 test3—从尾到头打印链表

    标题:剑指offer java版 test3-从尾到头打印链表 题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 解答:知识不够全面,用ArrayList做的 但是看到大佬们还可以 ...

  2. 剑指offer java版 test42—找出和为S的两个数,左右夹逼法(双指针法)

    前言:受上一题的启发,这题自己也编出来了.在碰到这种有序数列的时候,经常会用到双指针法,一个指左边,一个指右边,然后依照规则移动,增加或缩小范围.很实用. 题目: 输入一个递增排序的数组和一个数字S, ...

  3. 剑指offer java版(三)

    二叉搜索树的后序遍历 问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 对于后序遍历来说, ...

  4. 剑指offer没有java版吗_剑指Offer(Java版) 持续更新中

    面试题2 单例(之前有整理,略) 面试题3 二维数组中的查找 public boolean find(int target, int [][] array) { boolean found = fal ...

  5. 剑指Offer第二版Java代码实现

    剑指Offer第二版Java代码实现 A.单例模式 面试题 2:实现Singleton模式 B.面试需要的基础知识 面试题 3:数组中重复的数字 面试题 4:二维数组的查找 面试题 5:替换空格 面试 ...

  6. 剑指offer最新版_剑指Offer——Java版本(持续更新)

    0 前言 邻近校招,算法要命!!! 本文为研究剑指Offer过程中的笔记,整理出主要思路以及Java版本题解,以便记忆和复习. 参考整理来自<剑指Offer 第二版>. 特别注意,对每道题 ...

  7. 剑指offer第二版(leetcode)Java题解(不断更新)

    1 数组中的重复数字 题目 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一 ...

  8. 牛客网剑指offer——Java题解

    剑指offer JZ1 二维数组中的查找 题目描述 在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这 ...

  9. 剑指offer第二版答案详细版(带详细解题思路)

    1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...

最新文章

  1. (读书笔记).NET大局观-.NET语言(1)
  2. CSS keylogger:攻击与防御
  3. C++ STL快速入门
  4. 里面怎么缓存图片_浏览器缓存原理总结
  5. CentOS设置开机自动启动某服务
  6. 使用.NetCore 控制台演示 熔断 降级(polly)
  7. [Cake] 0.C#Make自动化构建-简介
  8. 消息队列终极解决方案——Stream(下)
  9. Enterprise Library Step By Step系列(十六):使用AppSetting Application Block
  10. Linux汇编调试器EDB
  11. SeSe 2005-02-11 -- 2005-02-12
  12. 经典商业模式案例第1例:校园O2O
  13. 批量文件转换:PDG转PDF并合并
  14. python宠物系统_小练习 宠物管理系统
  15. The application server could not be contacted
  16. 并发完全知识点目录--yzy
  17. 高德地图猎鹰sdk服务service Id的创建
  18. UBC 计算机专业 要求 英语 A,赴加拿大留学语言成绩的要求
  19. 牧师与魔鬼——动作分离版
  20. matlab文件名批量读取dat文件,matlab批量读取dat

热门文章

  1. java 入门 博客园_javaweb入门
  2. linux文件夹打包命令
  3. Bootstrap使用-1
  4. 本机在合成图片经常提示内存不足
  5. 最大流自用模板(例题:HDU1532)
  6. 为什么空格拷贝到linux 会变成两个
  7. 推荐系统中的矩阵分解演变方式
  8. 不能读取文件“itunes.library.itl”因为它是由更高级别的itunes所创建的
  9. Delphi面向对象学习随笔七:COM
  10. 青海行--(7月26日)翻越祁连山