题目1

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

  1. public class Solution {
  2. public int NumberOf1(int n) {
  3. int count = 0;
  4. while(n!=0){
  5. count++;
  6. n = n&(n-1);
  7. }
  8. return count;
  9. }
  10. }

题目2


题目描述

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

考虑下0和负数的情况即可

  1. public class Solution {
  2. public double Power(double base, int exponent) {
  3. double result = 1.00;
  4. for(;exponent>0;exponent--)
  5. result*=base;
  6. if(exponent<0){
  7. for(;exponent<0;exponent++)
  8. result*=base;
  9. return 1/result;
  10. }
  11. return result;
  12. }
  13. }

题目3

题目描述

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

记得是要导包的,时间复杂度和空间复杂度都是O(n)

  1. import java.util.*;
  2. public class Solution {
  3. public void reOrderArray(int [] array) {
  4. int []test = Arrays.copyOf(array,array.length);
  5. int index=0;
  6. for(int i=0;i<test.length;i++){
  7. if(test[i]%2==1){
  8. array[index]=test[i];
  9. index++;
  10. }
  11. }
  12. for(int i=0;i<test.length;i++){
  13. if(test[i]%2==0){
  14. array[index]=test[i];
  15. index++;
  16. }
  17. }
  18. }
  19. }

题目4

题目描述

输入一个链表,输出该链表中倒数第k个结点。

  1. /*
  2. public class ListNode {
  3. int val;
  4. ListNode next = null;
  5. ListNode(int val) {
  6. this.val = val;
  7. }
  8. }*/
  9. public class Solution {
  10. public ListNode FindKthToTail(ListNode head,int k) {
  11. if(head==null||k==0)
  12. return null;
  13. ListNode node1 = head;
  14. ListNode node2 = head;
  15. for(int i=0;i<k-1;i++)
  16. {
  17. if(node1.next==null)
  18. return null;
  19. node1 = node1.next;
  20. }
  21. while(node1.next!=null){
  22. node1 = node1.next;
  23. node2 = node2.next;
  24. }
  25. return node2;
  26. }
  27. }

题目5

题目描述

输入一个链表,反转链表后,输出链表的所有元素。

自己的做法(两个指向,一个用来遍历一个用来保存)+自己基础上更简单的+ 递归的方法

  1. /*
  2. public class ListNode {
  3. int val;
  4. ListNode next = null;
  5. ListNode(int val) {
  6. this.val = val;
  7. }
  8. }*/
  9. public class Solution {
  10. public ListNode ReverseList(ListNode head) {
  11. if(head==null)
  12. return null;
  13. ListNode last_node=null;//上一个为空
  14. ListNode node = head;
  15. while(node.next!=null)
  16. {
  17. //保存下一个的位置
  18. ListNode next = node.next;
  19. //进行逆转修改,并保存当前节点为上一个节点
  20. node.next = last_node;
  21. last_node = node;
  22. //遍历跳转至下一个
  23. node = next;
  24. }
  25. node.next=last_node;//最后一次逆转修改
  26. return node;
  27. }
  28. }

  1. public ListNode ReverseList(ListNode head) {
  2.     ListNode pre = null;
  3.     ListNode next = null;
  4.     while (head != null) {
  5.         next = head.next;
  6.         head.next = pre;
  7.         pre = head;
  8.         head = next;
  9.     }
  10.     return pre;
  11. }

递归解法

  1. /*
  2. public class ListNode {
  3. int val;
  4. ListNode next = null;
  5. ListNode(int val) {
  6. this.val = val;
  7. }
  8. }*/
  9. public class Solution {
  10. public ListNode ReverseList(ListNode head) {
  11. //如果链表为空或者链表中只有一个元素
  12. if(head==null||head.next==null)
  13. return head;
  14. //不断化解为更小的head.next链表逆转
  15. ListNode pReverseNode=ReverseList(head.next);
  16. head.next.next=head;//将下个节点的next设置为自己,层层调用之后就会全部逆转了
  17. head.next=null;//虽然每层head.next都职位null了,但其实只是为了最后一个节点可以置为null
  18. return pReverseNode;//此处无论调用到多少层,返回的都是原链表最后一个
  19. }
  20. }

题目6

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

有点点难度...

简单的递归解法(还有复杂的非递归方法):

  1. public ListNode Merge(ListNode list1,ListNode list2) {
  2. if(list1 == null){
  3. return list2;
  4. }
  5. if(list2 == null){
  6. return list1;
  7. }
  8. if(list1.val <= list2.val){
  9. list1.next = Merge(list1.next, list2);
  10. return list1;
  11. }else{
  12. list2.next = Merge(list1, list2.next);
  13. return list2;
  14. }
  15. }

算法学习之剑指offer(三)的更多相关文章

  1. 算法学习之剑指offer(十一)

    一 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. import java.util.*; ...

  2. 算法学习之剑指offer(九)

    一 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). public class Solution ...

  3. 算法学习之剑指offer(六)

    题目1 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. import java.util.*; public cl ...

  4. 算法学习之剑指offer(十)

    一 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3 ...

  5. 算法学习之剑指offer(八)

    题目一 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没 ...

  6. 算法学习之剑指offer(五)

    题目1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. public class Solution ...

  7. 算法学习之剑指offer(四)

    题目1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) /** public class TreeNode { int val = 0; Tree ...

  8. 算法学习之剑指offer(一)

    题目一: 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路1:遍历 ...

  9. 算法学习之剑指offer(十二)

    一 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...

随机推荐

  1. PyTorch在笔记本上实现CUDA加速

    最近刚开始学习深度学习,参考了一篇深度学习的入门文章,原文链接:https://medium.freecodecamp.org/everything-you-need-to-know-to-maste ...

  2. JDK8时间工具类

    JDK8添加了java.time包,提供了很多方便.用得比较多的几个类:Instant 在时间线上模拟单个瞬时点Duration 以秒和纳秒为单位模拟一个数量或时间量.可以使用其他基于持续时间的单位访 ...

  3. 一步一步搞安卓开发(AndroidStudio)

    一.前言 好长时间没做过Android应用开发了,由于工作需要,又要开始做这一块了.记得之前都是用Eclipse+ADT+ADK来开发的,官网上下载个adt-bundle就可以了,现在官方已经不更新了 ...

  4. 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  5. Python Api接口自动化测试框架 excel篇

    工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务moduleName查找对应表单,运用第三方库req ...

  6. java架构之路-(spring源码篇)由浅入深-spring实战详细使用

    今天我更新了一篇jvm垃圾回收的算法和垃圾回收器的内部逻辑,但是看的人不多啊......貌似大家还是比较喜欢看源码吧,毕竟实战要比理论用的多. 这篇文章不会详细的深入底层源码,只是基于注解和配置来说说 ...

  7. java教程系列二:Java JDK,JRE和JVM分别是什么?

    多情只有春庭月,犹为离人照落花. 概述 本章主要了解JDK,JRE和JVM之间的区别.JVM是如何工作的?什么是类加载器,解释器和JIT编译器.还有一些面试问题. Java程序执行过程 在深入了解Ja ...

  8. Hadoop集群常用的shell命令

    Hadoop集群常用的shell命令 Hadoop集群常用的shell命令 查看Hadoop版本 hadoop -version 启动HDFS start-dfs.sh 启动YARN start-ya ...

  9. mysql隔离级别的测试

    mysql提供四种隔离级别,以下分别对四种隔离级别进行测试,更加直观清晰的了解.具体的隔离级别以及其他相关介绍见https://www.cnblogs.com/eric-fang/p/11052304 ...

  10. UnicodeDecodeError: 'gbk' codec can't decode byte 0xb0 in position 279: illegal multibyte sequence

    with open(r'E:\yy\mysql.txt') as wk: print(wk.readlines()) Traceback (most recent call last): File & ...