1、二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:解决这道题的思路比较简单,就是将整数转换为二进制,然后得到二进制中1的个数,有两种方法:
- 方法一
直接调用Integer中的库函数toBinaryString转换为二进制,把该二进制转换为字符数组,循环判断字符是否为1。
- 方法二
采用移位的策略,假设数字12转换为二进制为1100,减1后就变为1001,如果将(1100)&(1001)=1000,利用这个特性,我们可以计算出二进制中1的个数。
调用库函数
public class Solution { public int NumberOf1(int n) { int result=0; char[] ch=Integer.toBinaryString(n).toCharArray(); for(int i=0;i<ch.length;i++){ if(ch[i]=='1'){ result++; } } return result; }}
移位操作
public class Solution { public int NumberOf1(int n) { int result=0; while(n!=0){ result++; n=n&(n-1); } return result; }}
2、数值的整数次方
题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0
思路:这道题有个陷阱需要考虑,就是exponent的正负不确定,所以这两种情况都要考虑到,
假设exponet为正,我们的思路通常是这样的:
①假如exponent为0,直接返回1
②假如exponent,不为0,我们可以利用for循环不断的累乘
假如exponent为负,我们不妨对exponent=-exponent,然后利用exponent为正式计算base的exponent,对于最后的输出结果,我们只需要对结果取倒数即可。
代码
public class Solution { public double Power(double base, int exponent) { double result=base; int n=exponent; if(exponent<0){ exponent=-exponent; } if(exponent==0){ return 1; } for(int i=1;i<exponent;i++){ result*=base; } return n<0 ? 1/result : result; }}
3、调整数组数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:这道题关键点在于要保证奇数和奇数、偶数和偶数之间的相对位置不变,所以这道题有两种方法可以解决
- 冒泡排序
冒泡排序是两两比较数组中的相邻元素,我们可以把这道题目看作为冒泡排序的变种,将交换条件变为判断相邻元素是否为奇数、偶数
- 插入排序
插入排序是通过移位的方式来完成交换的,我们也是同样的将条件变为判断相邻元素是否为奇数、偶数来到达排序的目的
冒泡排序
public class Solution { public void reOrderArray(int [] array) { for(int i=0;i<array.length-1;i++){ for(int j=0;j<array.length-1-i;j++){ if(array[j]%2==0&&array[j+1]%2!=0){ int temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; } } } }}
插入排序
public class Solution { public void reOrderArray(int [] array) { //插入坐标 int insertIndex=0; //要插入的值 int insertValue=0; //循环比较判断 for(int i=1;i<array.length;i++){ insertIndex=i-1; insertValue=array[i]; while(insertIndex>=0&&array[insertIndex]%2==0&&insertValue%2!=0){ array[insertIndex+1]=array[insertIndex]; insertIndex--; } if(insertIndex+1!=i){ array[insertIndex+1]=insertValue; } } }}
4、链表中倒数第K个结点
题目:输入一个链表,输出该链表中倒数第k个结点。
思路:这道题的关键点在于倒数第K个结点,最简单的做法就是先计算出链表中元素的个数count,然后利用index=(count-k)判断结点在链表中的正序位置。
代码:
/*public class ListNode { int val; ListNode next = null;
ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head==null){ return null; } if(k<=0){ return null; } int count=1; ListNode node=head; while(head.next!=null){ head=head.next; count++; } count=count-k; if(count<0){ return null; } for(int i=0;i<count;i++){ node=node.next; } return node; }}
看了这篇文章,你是否「博学」了