牛客網做題總結:劍指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刷題】動態規劃與貪婪法題3:劍指Offer-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表示這裡