劍指Offer行榜【牛客網】練習(三)
阿新 • • 發佈:2019-01-12
1、二進位制中1的個數
題目描述:
輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示
程式碼:
public class Solution {
public int NumberOf1(int n) {
String str = Integer.toBinaryString(n);
int count = 0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='1'){
count++;
}
}
return count;
}
}
2、數值的整數次方
題目描述:
給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
程式碼:
//直接呼叫函式的程式碼
public class Solution {
public double Power(double base, int exponent) {
return Math.pow(base,exponent);
}
}
//手擼的程式碼
public class Solution {
public double Power(double base, int exponent) {
double result = 1;
if(exponent==0){
}else if(exponent>0){
int ex = exponent;
while(ex>0){
result*=base;
ex--;
}
}else{
int ex = - exponent;
while(ex>0){
result/=base;
ex--;
}
}
return result;
}
}
3、調整陣列順序使奇數在偶數之前且順序不變
題目描述:
輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
程式碼:
import java.util.ArrayList;
public class Solution {
public void reOrderArray(int [] array) {
ArrayList<Integer> odd = new ArrayList<>();
ArrayList<Integer> even = new ArrayList<>();
for(int i=0;i<array.length;i++){
if(array[i]%2==0){
even.add(array[i]);
}else{
odd.add(array[i]);
}
}
for(int i=0;i<odd.size();i++){
array[i] = odd.get(i);
}
for(int i=0;i<even.size();i++){
array[i+odd.size()] = even.get(i);
}
}
}
4、連結串列中的倒數第k個結點
題目描述:
輸入一個連結串列,輸出該連結串列中倒數第k個結點。
思路:
找到長度,得到正序length-k
注意點:
length-k<0時,返回null
程式碼:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode h = head;
int length = 0;
while(h!=null){
h = h.next;
length++;
}
int order = length-k;
if(order<0){
return null;
}
ListNode r = head;
while(order>0){
r = r.next;
order--;
}
return r;
}
}
5、連結串列翻轉
題目描述:
輸入一個連結串列,反轉連結串列後,輸出新連結串列的表頭。
思路:
1、遞迴
反轉=當前結點作為剩下部分的最後結點的next
2、非遞迴
使用兩個指標依次倒序
注意點:
遞迴方法——反轉後,當前結點的next需要置為null
非遞迴方法——先儲存next,再替換next
程式碼:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
/**
使用遞迴的演算法如下,但是複雜度太大。
*/
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null){
return head;
}else{
ListNode leftPart = ReverseList(head.next);
ListNode l = leftPart;
while(l.next!=null){
l = l.next;
}
l.next = head;
head.next = null;
return leftPart;
}
}
}
//非遞迴
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null){
return head;
}
ListNode h1 = head;
ListNode h2 = head;
h1 = h1.next;
ListNode h1next = h1.next;
ListNode h2next = h2.next;
h1.next = h2;
h2.next = null;
h1 = h1next;
h2 = h2next;
if(h1next==null){
return h1;
}
while(h1.next!=null){
h1next = h1.next;
h2next = h1;
h1.next = h2;
h1 = h1next;
h2 = h2next;
}
h1.next = h2;
return h1;
}
}
//非遞迴
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null){
return head;
}
ListNode node = null;
ListNode h = head;
while(h!=null){
ListNode hnext = h.next;
h.next = node;
node = h;
h = hnext;
}
return node;
}
}