1. 程式人生 > >華為機試小練習

華為機試小練習

1. 去重+排序問題

明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤1000),對於其中重複的數字,只保留一個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成“去重”與“排序”的工作(同一個測試用例裡可能會有多組資料,希望大家能正確處理)

Input Param

n               輸入隨機數的個數

inputArray      n個隨機整陣列成的陣列

Return Value

OutputArray    輸出處理後的隨機整數
注:測試用例保證輸入引數的正確性,答題者無需驗證。測試用例不止一組。

輸入描述

輸入多行,先輸入隨機整數的個數,再輸入相應個數的整數

輸出描述:

返回多行,處理後的結果

示例1

輸入

11
10
20
40
32
67
40
20
89
300
400
15

輸出

10
15
20
32
40
67
89
300
400

同時實現去重和排序功能(點陣圖法):

import java.util.Scanner;
import java.util.*;

public class Main{
    public static void main(String [] args){
        Scanner sc=new Scanner(System.in);
        //先處理輸入多組資料
        //用空間換時間採用計數排序點陣圖法排序
        while(sc.hasNext()){
            int N=sc.nextInt();
            int a[ ]=new int [1001];
            while(N>0){
                int n=sc.nextInt();
                a[n]=1;
                N--;
            }
            for(int  i=0;i<1001; i++){
                if(a[i]!=0)
                    System.out.println(i);
            }
        }
    }
}

原始TreeSet去重:

while(sc.hasNext()){
            int n=sc.nextInt();
            TreeSet<Integer> ts=new TreeSet<>();
            while(n>0){
                ts.add(sc.nextInt());
                n--;
            }
            for(int i: ts){
                System.out.println(i);
            }
        }        

2  切割字串補0

•連續輸入字串,請按長度為8拆分每個字串後輸出到新的字串陣列;
•長度不是8整數倍的字串請在後面補數字0,空字串不處理。

輸入描述:

連續輸入字串(輸入2次,每個字串長度小於100)

輸出描述:

輸出到長度為8的新字串陣列

示例1

輸入

abc
123456789

輸出

abc00000
12345678
90000000
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){        
            String s = new String(sc.nextLine());
            if(s.length()%8 !=0 )
                s = s + "00000000";
             
            while(s.length()>=8){
                System.out.println(s.substring(0, 8));  //切割字串 包括前面--不包括後面
                s = s.substring(8);  //開始下標----結束位置
            }
        }
    }
}

 缺點: 字串不斷進行這樣的計算,其實效率比較低,最好建議直接使用StringBuffer這樣可變陣列進行操作。

import java.util.*;

public class Main{
    public static void main(String [] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String s=sc.nextLine();
            StringBuffer sb=new StringBuffer(s);
            if( s.length() %8!=0){
                for(int i=0; i< 8- s.length()%8 ;i++)
                    sb.append('0');
            }
            while(sb.length() >=8){
                System.out.println(sb.substring(0,8));
                sb.delete(0,8);
            }
        }
    }
}

3 字串反轉

    • trim()

      返回一個字串,其值為此字串,並刪除任何前導和尾隨空格。

 將一個英文語句以單詞為單位逆序排放。例如“I am a boy”,逆序排放後為“boy a am I”
所有單詞之間用一個空格隔開,語句中除了英文字母外,不再包含其他字元

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String str = in.nextLine();
            String[] s = str.split(" ");
            StringBuffer sb = new StringBuffer();
            for(int i = s.length-1; i >= 0; i--){
                sb.append(s[i] + " ");
            }
            System.out.println(sb.toString().trim());
        }
    }
}

單獨把最後一個列出來列印:

import java.util.*;
public class Main{
    public static void main(String [] args){
        Scanner sc=new Scanner(System.in);
        String oriStr=sc.nextLine();
        String [] arr=oriStr.split(" ");
        for(int i=arr.length-1; i>0;i--){
            System.out.print(arr[i]+" "); //除了最後一個單詞沒有列印
        }
        System.out.print(arr[0]);
    }
}

4  字串排序

需要注意的一些點:

1 Character.isLetter(char c) :判斷是否是字母

2  Collections.sort(Collection , new Comparater<>(){   

                  public int compare(......)

                         return ......

     });

編寫一個程式,將輸入字串中的字元按如下規則排序。

規則 1 :英文字母從 A 到 Z 排列,不區分大小寫。

       如,輸入: Type   輸出: epTy

規則 2 :同一個英文字母的大小寫同時存在時,按照輸入順序排列。

     如,輸入: BabA   輸出: aABb

規則 3 :非英文字母的其它字元保持原來的位置。

     如,輸入: By?e   輸出: Be?y

樣例:

    輸入:

   A Famous Saying: Much Ado About Nothing(2012/8).

    輸出:

   A  aaAAbc   dFgghh :  iimM   nNn   oooos   Sttuuuy  (2012/8).

import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {
            String str = in.nextLine();
            List<Character> list = new LinkedList<Character> ();
            char[] ss = str.toCharArray();
            for(char c: ss) {
                if(Character.isLetter(c))
                    list.add(c);  
             }  
              
             Collections.sort(list, new Comparator<Character> () {
                @Override
                public int compare(Character o1, Character o2) {
                    return Character.toLowerCase(o1)-Character.toLowerCase(o2);
                }
                 
             });
              
             StringBuilder sb = new StringBuilder();
             int totalLen = 0;
             for(char temp: ss) {
                if(Character.isLetter(temp) && totalLen<list.size()) {
                    sb.append(list.get(totalLen));
                    totalLen += 1;
                }else {
                    sb.append(temp);
                }
                 
             }
             System.out.println(sb.toString());
        }
         
    }
}

5 字串中最長迴文串長度

思路: 以一個字元往左右分別擴充套件 考慮奇數和偶數兩種情況

中心擴充套件就是把給定的字串的每一個字母當做中心,向兩邊擴充套件,這樣來找最長的子迴文串。演算法複雜度為O(N^2)。

但是要考慮兩種情況:

1、像aba,這樣長度為奇數。

2、想abba,這樣長度為偶數。

//題意:輸入一個字串--->輸出此字串中最長的迴文串
//思路:最直觀的思路以一個字元為中心向兩邊進行擴充套件--->考慮奇數字符串和偶數字符串
import java.util.*;
public class Main{
    public static void main(String [] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String s=sc.nextLine();
            System.out.println(maxLength(s));
        }
    }
    //對輸入的字串進行奇數和偶數兩種擴充套件
    private static int maxLength(String s){
        //考慮輸入字串的各種情況
        int len=s.length();
        if(len<1)
            return 0;
        int max=1;   //長度為1或者最小回文字串長度為1
        //考慮奇數的情況 k i j   k-- j-- 存在不符合的就break
        for(int i=1; i<len;i++){
            int k=i-1;
            int j=i+1;
            int count=0;  //統計符合條件的對數
            while(k>=0 && j<= len-1){
                if(s.charAt(k--)==s.charAt(j++))
                    count++;
                else 
                    break;
            }
            //記錄最大值 每一輪的所有可能的count都已經比較並記錄
            max=( max >= 2*count+1) ? max: 2*count+1;
        }
        
        //考慮偶數的情況 其實就是 k i(j) k-- j++ 同步移動
        for(int i=1;i<len-1;i++){
            int k=i-1;
            int j=i;
            int count=0;
            while( k>=0 && j<= len-1){
                if(s.charAt(k--)== s.charAt(j++))
                    count++;
                else
                    break;
            }
            max=( max>= 2*count)? max: 2* count ;
        }
        //max是全域性變數所以經歷奇數偶數兩種情況之後此時記錄的一定是最長迴文串的長度
        return max;
    }
}

6  整數中1 的個數(轉為二進位制後最多有幾個1)

思路: 就是位運算的思路    n&1 ----n=n>>1  統計

          另一種  抵消1    n=n &(n-1)  count++

          另一種 是利用java自帶的轉換函式   String  Integer.toBinartString(int n) ---->去統計其中每一位上字元為'1'的個數即可

輸入一個int型的正整數,計算出該int型資料在記憶體中儲存時1的個數。

輸入描述:

 輸入一個整數(int型別)

輸出描述:

 這個數轉換成2進位制後,輸出1的個數

import java.util.*;
 
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int count = 0;
        while(n>0){
            if((n&1)>0){  //注意()這個細節 必須作為一個整體 否則會失敗
                count++;
            }
            n=n>>1;
        }
        System.out.println(count);
    }
}
//另一種:抵消1  n&(n-1)
import java.util.*;
public class Main{
    public static void main(String [] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int count=0;
        while(n>0){
            n=n&(n-1);
            count++;
        }
        System.out.println(count);
    }
}
//利用java 自帶一些函式進行二進位制轉換
import java.util.*;
public class Main{
    public static void main(String [] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int count=0;
        String s=Integer.toBinaryString(n);
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='1')
                count++;
        }
        System.out.println(count);
    }
}

7 刪除字串中出現次數最少的字元

解法: 當字元只有字母時 可以想到點陣圖法

//思路1:用點陣圖法去做 都是小寫字母 最多有26個
//遍歷一遍  裝桶 再遍歷一遍 確定最小的  再遍歷一遍尋找最小的 不是最小的則輸出

//思路2:用map結構存放 字元和對應出現次數---Collections現有函式取出最小值---StringBuffer去裝載不是最小值的字元--輸出即可

實現刪除字串中出現次數最少的字元,若多個字元出現次數一樣,則都刪除。輸出刪除這些單詞後的字串,字串中其它字元保持原來的順序。 

輸入描述:

字串只包含小寫英文字母, 不考慮非法輸入,輸入的字串長度小於等於20個位元組。

輸出描述:

刪除字串中出現次數最少的字元後的字串。

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        while(cin.hasNext()) {
            int[] num = new int[26];
            String line = cin.nextLine();
            for(int i=0; i<line.length(); i++) {
                char c = line.charAt(i);
                int n = (int)(c - 'a');
                num[n] ++;
            }
            int min = Integer.MAX_VALUE;
            for(int i=0; i<26; i++) {
                if(num[i] != 0 && num[i] < min) {
                    min = num[i];
                }
            }
            for(int i=0; i<line.length(); i++) {
                char c = line.charAt(i);
                int n = (int)(c - 'a');
                if(num[n] != min) {
                    System.out.print(c);
                }
            }
            System.out.println();
        }
    }
}
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
             
        String string=sc.nextLine();
        char[] A=string.toCharArray();
        Map<Character,Integer> m=new LinkedHashMap<Character,Integer>();
       
         
        for(char c:A){
            if(!m.containsKey(c)){
                 m.put(c,1);
                 
            }else{
                m.put(c,m.get(c)+1);
                
            }     
        }
        Collection<Integer> al=m.values();
        int index=Collections.min(al);
      StringBuffer sb=new StringBuffer("");
        for(char c:A){
            if(m.get(c)!=index)
                sb.append(c);
        }
             
            System.out.print(sb.toString());
             
       }
        
    }
}

相關推薦

練習

1. 去重+排序問題 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤1000),對於其中重複的數字,只保留一個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排

練習

ace tor 排序 技術分享 length a-z string it! 計算 1. 計算字符個數 輸入 ABCDEF A 輸出 1 #include <iostream> #include <cstring> using n

輸入n個整數,輸出其中最的k個/(C/C++)

題目描述 輸入n個整數,輸出其中最小的k個。 詳細描述: 介面說明 原型: bool GetMinK(unsignedint uiInputNum, int * pInputArray, un

[練習題]2.大數求和

cout views 華為上機 大數 高位到低位 pretty 類別 ade iostream 題目二[大數求和] 描寫敘述: 給定兩個非常大的正整數A和B。位數在50至100之間。求C=A+B; 題目類別: 字符串 難度: 中級

2014(一)

ack cpp string.h ont const 機試題 輸出字符串 abcd 函數 2014華為機試(一)/****************************************************************************

-字符串匹配

輸入 scanner i++ -m 實現 ret 字符 als num 題目描述 題目標題: 判斷短字符串中的所有字符是否在長字符串中全部出現 詳細描述: 接口說明 原型: boolIsAllCharExist(char* pShortString,char* pLo

-密碼強度等級

java程序 strong while oid ont || ascii wds tro 題目描述 密碼按如下規則進行計分,並根據不同的得分為密碼進行安全等級劃分。 一、密碼長度: 5 分: 小於等於4 個字符 10 分: 5 到

[練習題]56.求子數組的最大和

== process ack turn 多個 popu 基礎 ace ava 題目 描寫敘述: 輸入一個整形數組。數組中連續的一個或多個整數組成一個子數組,每一個子數組都有一個和。求全部子數組的和的最大值。 接口 Int GetSub

—變形的楊輝三角形

mar ios alt mark word http processor string tex 變形的楊輝三角形 每一個數是上行,左右3個數之和,不存在為0,求第n行第一個偶數出現的位置,沒有輸出-1。 #include<iostrea

】找最高分(通過此題熟悉牛客網Node輸入輸出)

length 輸出 ons ken [0 接下來 lin tput int 來源:牛客網 老師想知道從某某同學當中,分數最高的是多少,現在請你編程模擬老師的詢問。當然,老師有時候需要更新某位同學的成績. 輸入描述: 輸入包括多組測試數據。每組輸入第一行是兩個正整數N和M(0

:字串的連接最長路徑查找

too 小寫 while arrays 空間 i++ har cap over 這個題更應該叫做字符串字典序排序 題目描述 給定n個字符串,請對n個字符串按照字典序排列。 輸入描述: 輸入第一行為一個正整數n(1≤n≤1000),下面n行為n個字符串

:汽水瓶

方法 new code imp subject tint 表示 next quest 題目描述 有這樣一道智力題:“某商店規定:三個空汽水瓶可以換一瓶汽水。小張手上有十個空汽水瓶,她最多可以換多少瓶汽水喝?”答案是5瓶,方法如下:先用9個空

】—— 6.質數因子

string ner out system pre 分享 args 機試 分享圖片 題目 解法 import java.util.Scanner; public class Main { public static void main(Strin

提取不重復的整數

des back 重復 mes 提取 push_back pan i++ -h 題目描述 輸入一個int型整數,按照從右向左的閱讀順序,返回一個不含重復數字的新的整數。 輸入描述: 輸入一個int型整數 輸出描述: 按照從右向左的閱讀順序,返回一個不含重復數字的新的整

試題(練習

目錄 1、選秀節目打分 2、奇偶排序 3、作業系統任務排程問題。 4. 列印陣列中最大的2個數 5.迴文數字判斷。  6.中級題:亮著電燈的盞數   7.高階題:地鐵換乘 8.判斷if語句括號是否合法 9. 列印 楊輝三角形

牛客網 - 線上程式設計 - - 合併表記錄

題目描述 資料表記錄包含表索引和數值,請對錶索引相同的記錄進行合併,即將相同索引的數值進行求和運算,輸出按照key值升序進行輸出。 輸入描述: 先輸入鍵值對的個數 然後輸入成對的index和value值,以空格隔開 輸出描述: 輸出合併後的鍵值對(多

牛客網 - 線上程式設計 - - 字串字典順序排序

題目描述 給定n個字串,請對n個字串按照字典序排列。 輸入描述: 輸入第一行為一個正整數n(1≤n≤1000),下面n行為n個字串(字串長度≤100),字串中只含有大小寫字母。 輸出描述: 資料輸出n行,輸出結果為按照字典序排列的字串。 示例1

牛客網 - 線上程式設計 - - 刪除字串中出現次數最少的字元

題目描述 實現刪除字串中出現次數最少的字元,若多個字元出現次數一樣,則都刪除。輸出刪除這些單詞後的字串,字串中其它字元保持原來的順序。 輸入描述: 字串只包含小寫英文字母, 不考慮非法輸入,輸入的字串長度小於等於20個位元組。 輸出描述: 刪除字串中出現

牛客網 - 線上程式設計 - - 單詞倒排

題目描述 對字串中的所有單詞進行倒排。 說明: 1、每個單詞是以26個大寫或小寫英文字母構成; 2、非構成單詞的字元均視為單詞間隔符; 3、要求倒排後的單詞間隔符以一個空格表示;如果原字串中相鄰單詞間有多個間隔符時,倒排轉換後也只允許出現一個空格間隔符; 4、每個單詞最

牛客網 - 線上程式設計 - - 字串處理

題目描述 按照指定規則對輸入的字串進行處理。 詳細描述: 將輸入的兩個字串合併。 對合並後的字串進行排序,要求為:下標為奇數的字元和下標為偶數的字元分別從小到大排序。這裡的下標意思是字元在字串中的位置。 對排序後的字串進行操作,如果字元為‘0’——‘9’或者‘A’——‘F’