1. 程式人生 > >牛客網做題總結:劍指offer中題目,java版一

牛客網做題總結:劍指offer中題目,java版一

1、陣列中重複的數字

在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是重複的數字2或者3。

public class Solution {

    //Parameters:

    //   numbers:     an array of integers

    //   length:      the length of array numbers

    //    duplication:(Output) the duplicated number in the array number,length of duplication arrayis 1,so using duplication[0] = ? in implementation;

    //    Hereduplication like pointor in C/C++, duplication[0] equal *duplication in C/C++

    //   這裡要特別注意~返回任意重複的一個,賦值duplication[0]

    //       Returnvalue:       true if the input is valid, andthere are some duplications in the array number

//                    otherwise false

    boolean duplicate(int numbers[],int length,int [] duplication) {

        if(length<0) return false;

        int[]a = new int[length];

        for(int i=0;i<length;i++){

            a[numbers[i]]++;

        }

        for(int i=0; i<length;i++) {

                if(a[i]>1){

                    duplication[0]=i;

                    return true;

                }

        }

        return false;

    }

}

2、字元流中第一個不重複的字元

請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。

public class Solution {

    //Insertone char from stringstream

    Stringstr = "";

    int[] a= new int[256];

    void Insert(char ch)

    {

        str+=ch;

        a[(int)ch]++;

    }

  //return the firstappearence once char in current stringstream

    char FirstAppearingOnce()

    {

        for(int i=0;i<str.length(); i++) {

            if(a[(int)str.charAt(i)]==1){

                return str.charAt(i);

            }

        }

        return '#';

    }

}

3、正則表示式匹配

請實現一個函式用來匹配包括'.'和'*'的正則表示式。模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配

import java.util.regex.Pattern;

import java.util.regex.Matcher;

public class Solution {

    boolean match(char[]str, char[] pattern)

    {

        Strings = new String(str);

        Stringpa = new String(pattern);

        Patternp = Pattern.compile(pa);

        Matcherm  = p.matcher(s);

        return m.matches();

    }

}

4、構建成績陣列

給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

import java.util.ArrayList;

public class Solution {

    int[] multiply(int[]A) {

          int length = A.length;

        int[]B = new int[length];

        if(A== null || length <= 0)

            return null;

        B[0]= 1;

        for(int i= 1;i<length;i ++){

            B[i]= B[i-1] * A[i-1];

        }

        int temp = 1;

        for(int i = length- 2;i>= 0;i --){

            temp*= A[i+1];

            B[i]*= temp;

        }

        return B;

    }

}

5、陣列中只出現一次的數字

一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。

//num1,num2分別為長度為1的陣列。傳出引數

//將num1[0],num2[0]設定為返回結果

import java.util.*;

public class Solution {

    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {

        if(array.length<=1)  return;

        ArrayList<Integer>l = new ArrayList<Integer>();

        for(int i=0;i<array.length; i++) {

                if(l.contains(array[i])){

                    l.remove(l.indexOf(array[i]));

                } else{

                    l.add(array[i]);

                }

        }

        num1[0]=l.get(0);

        num2[0]=l.get(1);

    }

}

6、數字在排序陣列中出現的次數

統計一個數字在排序陣列中出現的次數。

public class Solution {

    public int GetNumberOfK(int [] array , int k) {

        int count = 0;

        for(int i=0;i<array.length; i++) {

            if(k==array[i])count++;

        }

       return count;

    }

}

7、陣列中的逆序對

在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數。

public class Solution {

    public int InversePairs(int [] array) {

        if(array.length<2) return 0;

        int count = 0;

        for(int i=0;i<array.length; i++) {

            for(int j=i+1;j<array.length; j++ ) {

                if(array[i]>array[j])count++;

            }

        }

        return count;

    }

}

8、第一個只出現一次的字元

在一個字串(1<=字串長度<=10000)中找到第一個只出現一次的字元。

返回:

1.字元在字串的位置

2.當字串長度為0時,返回-1

import java.util.*;

public class Solution {

    public int FirstNotRepeatingChar(Stringstr) {

        Map<Character,Integer>m=new HashMap<Character,Integer>();

        if(str.length()==0)

            return -1;

        //第一次掃描

        for(int i=0;i<str.length();i++)

        {

            //得到出現次數

            Integerfreq=m.get(str.charAt(i));

            m.put(str.charAt(i),freq==null?1:freq+1);

        }

        //第二次掃描

        for(int i=0;i<str.length();i++)

        {

            if(m.get(str.charAt(i))==1)

            {

                return i;

            }

        }

        return -1;

    }

}

9、把陣列排成最小的數

輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。

import java.util.*;

public class Solution {

    public StringPrintMinNumber(int [] numbers) {

          if(numbers==null||numbers.length<=0)

        return "";

        String[]ss=new String[numbers.length];

        for(int i=0;i<numbers.length;i++){

            ss[i]=numbers[i]+"";

        }

        Arrays.sort(ss,new Comparator<String>(){

            public int compare(Stringo1,String o2){

                return(o1+o2).compareTo(o2+o1);

            }

        });

        StringBuildersb=new StringBuilder();

        for(Stringeach:ss){

            sb.append(each);

        }

        return sb.toString();

    }

}

10、整數1出現的次數(從1到n整數中1出現的次數)

求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數

public class Solution {

    public int NumberOf1Between1AndN_Solution(int n) {

       int x=1;

        int count=0,k;

        for(int i=1;n/i>0;i*=10)

        {

            k=n/i;

            //k/10為高位數字

            count+=(k/10)*i;

            int cur=k%10;

            if(cur>x)

            {

                count+=i;

            }

            else if(cur==x)

            {

                //n-k*i為低位數字

                count+=n-k*i+1;

            }

        }

        return count;

    }

}

相關推薦

總結offer題目java

1、陣列中重複的數字 在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是重複的數

總結(1)

 在牛客網上做了一 些題,過來總結一下問題    1.陣列   二維陣列第一維長度代表每一列的元素個數,第二維代表每一行的元素個數且不能省略    2.關於類成員函式的過載,覆蓋和隱藏:     

C++ 總結

      20天的刷完1234道牛客網C++題,正確率嘛,還算可以,一般~ 1:正確率63% 2:查缺補漏,複習了非常非常多的知識點:牛客網做題筆記 3:當時主要的目的是為了筆試做準備的,找工作的

C++ 筆記【200總結

做了老半天,正確率只有60%~~~~~ 1:a[2][3],&a+1指向的是整個陣列之後的位置,a+1指向的是第二個陣列的首位置,*a+1指向的是第一個陣列的第二個位置 2:陣列作用於函式

c++筆記(

一邊做題一邊思考,才能夠提高學習的效率。為了加深記憶,將每天做的題的筆記記錄在部落格上。 1. 字元陣列與字串 char a[] = {'a','b'}; char b[] = {"ab"}; b陣列比a陣列多一個‘\0’。b為字串常量,a為字元陣列。

總結

近期在牛客網刷了一些題,總結了一些容易犯的錯誤,現在來一一列舉出來。 1.要清楚什麼是傳遞地址,什麼事傳遞值。 2.輸出“%s”時,遇到‘\0’就會停止, 3.對於左對齊要加-, %-30.4f, printf函式列印一個double型別的資料,要求:輸出

網線上程式設計專題《offer-面試題9相關題目》矩形覆蓋

題目連結: 題目描述:    解題思路: 2*n的大矩形,和n個2*1的小矩形 其中2*target為大矩陣的大小,target也是小矩形的個數。 有以下幾種情形: target <= 0 大矩形為2*0,直接return 1; target = 1

網線上程式設計專題《offer》(8)跳臺階

題目連線: 題目: 解題思路: 1. 問題分析 設f(n)表示青蛙跳上n級臺階的跳法數。 當只有一個臺階時,即n = 1時,只有1中跳法; 當n = 2時,有2種跳法; 當n = 3 時,有3種跳法; 當n很大時,青蛙在最後一步跳到第n級臺階時,有兩種情況:

網線上程式設計專題《offer-面試題17》合併兩個排序的連結串列

題目連結: 題目描述: 解題思路: (1)方法一: 修改兩個待合併連結串列的引用域,使它們稱為一個有序的連結串列list3。具體思路如下圖所示: 已經AC的程式碼: public class MergeLinkedList { // 定義結點

網線上程式設計專題《offer-面試題18》樹的子結構

題目連結: 題目描述: 解題思路: 本題的解題過程分為兩步: 1)第一步,在樹A中查詢與根結點的值一樣的結點,這實際上就是樹的遍歷。 2)第二步,判斷A樹中以R為根結點的子樹是不是和樹B具有相同的結構。如果結點R的值和樹B的根結點不相同,則以R為根結點的子樹

網線上程式設計專題《offer-面試題39》二叉樹的深度

題目連結: 題目描述: 解題思路: 解法:遞迴的遍歷一棵數的左右子樹。 已經AC的程式碼: public class treeDepth39 { public class Tr

網線上程式設計專題《offer-面試題37》兩個連結串列的第一個公共結點

題目連結: 題目描述: 解題思路: 首先遍歷兩個連結串列得到它們的長度,就能知道哪個連結串列比較長,以及長的連結串列比短的連結串列多幾個結點。在第二次遍歷的時候,在較長的連結串列上先走若干步,接著再同時在兩個連結串列上遍歷,找到的第一個相同的結點就是它們的第

【LeetCode & offer】動態規劃與貪婪法3Offer-46把數字翻譯成字串

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) 劍指Offer-46:把數字翻譯成字串 題目: 給定一個數字,我們按照如下規則把它翻譯為字串:0翻譯成“a”,1翻譯成“b”,……,11翻譯成“1”,……,25翻譯成“z”。一個數字可能有多個翻

網線上程式設計專題《offer-面試題38》數字在排序陣列出現的次數

題目連結: https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&tqId=11190&tPage=2&rp=2&ru=/ta/coding-interviews&

python刷日記offer-調整陣列順序使奇數位於偶數前面

輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。 解題思路 傳統方法應該是給兩個一前一後指標,遇到前偶數與後奇數時,就交換。然而我發現一個更簡便的方法,就是給兩個列表,奇偶分開放,最後

網線上程式設計專題《offer-面試題9》斐波那契數列

題目連結: 題目描述: 解題思路: (1)遞迴解法 此解法時間複雜度和空間複雜度都很大,我這裡不再給出詳細的程式碼。 (2)動態規劃解法 已經AC的程式碼: import java

Offer》——Singleton(Java

slack 但是 span ref https 安全 創建對象 如果 懶漢式 1.單例模式的定義   單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 2.單例模式的特點   單例類只能有一個實例。   單例類必須自己創建自己的唯一實例。   單

offer(二十二十二十二)包含min函式的棧字串的排列陣列出現超過一半的數字

20:包含min函式的棧 題目描述 定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式。 感覺題目很無聊。。。我大js做這題就是方便,也讓我深刻意識到相對其他語言js繼承的強大性和靈活性。。。 var stack = []; function push(node) { stack

數串

今天在牛客網刷題遇到數串問題:         剛開始自己思路是取出每個數的第一位存入num_head陣列,用log10()函式求出每個數的位數存入len陣列(最後合成最大數時作為10的冪),依次找到num_head中最大到最小的數,以此來判斷每個數

關於後的簡單總結

牛客網刷題總結-C++面向物件 C++類的資料成員的儲存型別,不能是auto、register和extern: 原因:auto/register/extern表示的是變數的儲存位置和作用域。auto變數儲存在函式的堆疊空間,register儲存在暫存器,extern表示這裡