91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中雙指針算法如何使用

發布時間:2022-08-26 17:43:44 來源:億速云 閱讀:172 作者:iii 欄目:開發技術

本篇內容主要講解“C語言中雙指針算法如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C語言中雙指針算法如何使用”吧!

一、最長不含重復字符的子字符串

1.題目要求

C語言中雙指針算法如何使用

2.個人題解

2.1 解題思路

利用雙指針,定義一個指針i和一個指針j

讓i開始走,固定住j,然后我們利用一個輔助數組來記錄下每個字符出現的次數。

比如對于字符串“abcabcdd”,當i走到第二個a的時候,a出現了兩次,這時候讓j開始向前走,走到b。

這時候i和j之間的字符串是bca。沒有重復的,i可以繼續走,j繼續固定。

i走到b的時候b出現兩次。這時候要移動j直至沒有字符出現次數超過兩次。如此反復直到i走到字符串結尾。

2.2 代碼實現

class Solution {
public:
    /**
     * 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    int lengthOfLongestSubstring(string s) {
        int len = s.length();
        int S[128];
        memset(S,0x00, sizeof(S));
        int ans = 0;
        for(int i=0,j=0;i<len;++i)
        {
            S[s.at(i)]++;
            while(S[s.at(i)]>1)
            {
                S[s.at(j)]--;
                j++;
            }
            ans=max(ans,i-j+1); //更新區間最大長度
        }
        return ans;
    }
};

2.3 代碼解析

首先定義數組S[128],利用memset函數來初始化該數組。

memset:作用是在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法。

for循環里聲明i,j 為0,先讓字符串的第一個字符對應的整數作為數組S的下標,該位置元素值加一;

如果沒有重復字符,ans遞增;如果有重復字符今后進入while循環,隨著j的遞增,之前數組里為一的元素值都會減一,為2的元素值也會減一并變為一;

接著j固定,i繼續增長,再有重復字符就會重復上述操作,最終通過max函數得到最大的無重復子字符串長度。

二、和為S的兩個數字

1.題目要求

C語言中雙指針算法如何使用

C語言中雙指針算法如何使用

2.個人題解

2.1 解題思路

根據題目可知該數組是升序排列,那我們可以用兩個指針:一個在左邊界,一個在右邊界。

如果數組下標對應的值相加比num小,那么就讓左邊指針遞增,反之則右邊指針遞減。

如果左右指針相等,說明沒有滿足條件的數對,返回空數組。

如果存在該數對,利用push_back方法插入數組并返回即可

2.2 代碼實現

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        int left,right;
        int i,j,k;
        vector<int> res;
        left=0;
        right=array.size()-1;
        //如果數組為空,返回空數組
        if(array.empty()){
            return res;
        }
        while(array[left]+array[right]!=sum && left!=right){
            if(array[left]+array[right]<sum){
                left+=1;
            }else if(array[left]+array[right]>sum){
                right-=1;
            }
        }
        //如果不存在該數對,返回空數組
        if(left==right){
            return res;
        }
        //如果存在
        res.push_back(array[left]);
        res.push_back(array[right]);
        return res;
    }
};

本題思路確定后代碼比較好理解,就沒有分析部分了。

這兩道題都是雙指針的解法:第一題相當于是相鄰指針,第二題則是雙端指針,各有特色。

到此,相信大家對“C語言中雙指針算法如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丹阳市| 南丰县| 宣威市| 竹山县| 朝阳县| 嘉祥县| 仙桃市| 修武县| 淮南市| 安平县| 大化| 武鸣县| 邳州市| 迁安市| 和龙市| 香格里拉县| 临海市| 崇文区| 内黄县| 丰宁| 东至县| 美姑县| 玉门市| 屏南县| 扶绥县| 米脂县| 克拉玛依市| 崇阳县| 大荔县| 阜康市| 玛纳斯县| 平罗县| 嘉义县| 深水埗区| 秦安县| 康马县| 东莞市| 大安市| 九江市| 克拉玛依市| 洛南县|