劍指offer編程題持續跟新(c++)

  1. 二維數組的查找
    題目描述:在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
    解題思路:暴力求解,遍歷整個數組,如果查詢到目標值就返回true。
    代碼:

    class Solution {
    public:
        bool Find(int target, vector<vector<int> > array) {
            bool flag =false;
            for(int i=0;i<array.size();i++)
            {
                for(int j=0;j<array[0].size();j++)
                {
                    if(target==array[i][j])
                    {
                       flag=true;
                        break; 
                    }
                     if(flag==true) break;
                }
            }
            return flag;
        }
    };
    
  2. 空格替換
    題目描述:請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。
    解題思路:從前往後遍歷字符串,統計空格個數。從後往前插入數值(因爲字符串長度變長了)
    代碼:

    class Solution {
    public:
    	void replaceSpace(char *str,int length) {
            int count=0;
                for(int i=0;i<length;i++)
                {
                    if(str[i]==' ')
                    {
                        count++;
                    }
                }
            for(int j=length-1;j>=0;j--)
            {
                if(str[j]!=' ')
                    str[j+2*count]=str[j];
                else
                {
                    count--;
                    str[j+2*count]='%';
                    str[j+2*count+1]='2';
                    str[j+2*count+2]='0';
                }
            }
    	}
    };
    
  3. 最小的K個數
    題目描述:輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
    解題思路:先對數據進行排序,然後取前K的數值。
    代碼:

    class Solution {
    public:
        vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
            vector<int> res;
            int n=input.size();
            if(input.empty()||k>input.size()) return res;
            sort(input.begin(),input.end());
            
            for(int i=0;i<k;i++)
            {
                res.push_back(input[i]);
            }
            return res;
        }
    };
    
  4. 跳臺階
    題目描述:一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
    解題思路:斐波那契數列
    代碼:

    class Solution {
    public:
        int jumpFloor(int number) {
            
            if(number<=0) return 0;
            if(number==1)return 1;
            if(number==2)return 2;
            return jumpFloor(number-1)+jumpFloor(number-2);
        }
    };
    
  5. 從尾到頭打印鏈表
    題目描述:輸入一個鏈表,按鏈表從尾到頭的順序返回一個ArrayList。
    解題思路:利用遞歸
    代碼:

    class Solution {
    public:
        vector<int> value;
        vector<int> printListFromTailToHead(ListNode* head) {
            ListNode *p=NULL;
            p=head;
            if(p!=NULL){
                if(p->next!=NULL){
                    printListFromTailToHead(p->next);
                }
                value.push_back(p->val);
            }
            return value;
        }
    };
    
  6. 二進制中1的個數
    問題描述:輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。
    代碼:

    class Solution {
    public:
         int  NumberOf1(int n) {
             int count=0;
             while(n!=0)
             {
                 n=n&(n-1);
                 count++;
             }
             return count;
         }
    };
    
  7. 調整數組順序是奇數位於偶數前面
    題目描述:輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
    代碼:

    class Solution {
    public:
        void reOrderArray(vector<int> &array) {
            vector<int> result;
            int n=array.size();
            for (int i=0;i<n;i++)
            {
                if(array[i]%2==1)
                    {
                    result.push_back(array[i]);
                }
            }
            for (int i=0;i<n;i++)
            {
                if(array[i]%2==0)
                    {
                    result.push_back(array[i]);
                }
            }
            array= result;
        }
    };
    
  8. 整數1出現的次數
    題目描述:求出113的整數中1出現的次數,並算出1001300的整數中1出現的次數?爲此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。
    代碼:

    class Solution {
    public:
        int NumberOf1Between1AndN_Solution(int n)
        {
            int count=0;
            if(n<=0) return 0;
            for(int i=0;i<=n;i++)
            {
                int tmp=i;
                while(tmp)
                {
                    if(tmp%10==1)
                    {
                        ++count;
                    }
                    tmp/=10;
                }
            }
            return count;
        }
    };
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章